我正在尋找更改行值的解決方案,直到出現特定行。
例如,這是一個資料框
df = pd.DataFrame({'ts_val' : [0,0,-1,-1,-1,-1,0,0,0,0,0],
'on&off' : [0,0,1,0,0,0,1,0,1,0,1]
})
Out[11] df
ts_val on&off
0 0 0
1 0 0
2 -1 1 #starting point
3 -1 0
4 -1 0
5 -1 0
6 0 1 #end point
7 0 0
8 0 1 #starting point 2
9 0 0
10 0 1 #end point 2
在上面的資料框中,我想將行替換df['on&off']為1直到另一個1出現在df['on&off']
更詳細地,在示例中,1出現在df['on&off'][2]起點上,另一個1出現在終點上df['on&off'][6]。我需要的值替換到1之間df['on&off'][2:6]。
例如,這個資料框:
ts_val on&off
0 0 0
1 0 0
2 -1 1
3 -1 1
4 -1 1
5 -1 1
6 0 1
7 0 0
8 0 1
9 0 1
10 0 1
uj5u.com熱心網友回復:
嘗試使用以下代碼段 - 按累積總和創建組Series.cumsum,獲取包含1所有未配對值的原始列中的組,將它們過濾為變數groups并將僅過濾的組設定為1:
s = df['on&off'].cumsum()
m = (s % 2).eq(1) & df['on&off'].eq(1)
groups = s[m]
df.loc[s.isin(groups), 'on&off'] = 1
print (df)
# Output:
ts_val on&off
0 0 0
1 0 0
2 -1 1
3 -1 1
4 -1 1
5 -1 1
6 0 1
7 0 0
8 0 1
9 0 1
10 0 1
編輯:
如果1缺少最后一個,則最后一組不完整并且無法處理該組解決方案是:
#tested solution with pair `1`s
df = pd.DataFrame({'ts_val' : [0,0,-1,-1,-1,-1,0,0,0,0,0],
'on&off' : [0,0,1,0,0,0,1,0,1,0,1]
})
s = df['on&off'].cumsum()
m1 = (s % 2).eq(1) & df['on&off'].eq(1)
m2 = (s % 2).eq(0) & df['on&off'].eq(1)
groups1 = s[m1]
groups2 = s.shift()[m2]
groups = set(groups1) & set(groups2)
print (groups)
{1.0, 3.0}
df.loc[s.isin(groups), 'on&off'] = 1
print (df)
ts_val on&off
0 0 0
1 0 0
2 -1 1
3 -1 1
4 -1 1
5 -1 1
6 0 1
7 0 0
8 0 1
9 0 1
10 0 1
#last 1 is removed, so only one group
df = pd.DataFrame({'ts_val' : [0,0,-1,-1,-1,-1,0,0,0,0,0],
'on&off' : [0,0,1,0,0,0,1,0,1,0,0]
})
s = df['on&off'].cumsum()
m1 = (s % 2).eq(1) & df['on&off'].eq(1)
m2 = (s % 2).eq(0) & df['on&off'].eq(1)
groups1 = s[m1]
groups2 = s.shift()[m2]
groups = set(groups1) & set(groups2)
print (groups)
{1.0}
df.loc[s.isin(groups), 'on&off'] = 1
print (df)
ts_val on&off
0 0 0
1 0 0
2 -1 1
3 -1 1
4 -1 1
5 -1 1
6 0 1
7 0 0
8 0 1
9 0 0
10 0 0
uj5u.com熱心網友回復:
我基本上使用了一個標志來跟蹤起點和終點。df.shape 給出了行數和列數。
flag = 1
for i in range(df.shape[0]):
if df['on&off'].iloc[i] == 1 and flag == 1:
flag = 0
elif df['on&off'].iloc[i] == 0 and flag == 0:
df['on&off'].iloc[i] = 1
elif df['on&off'].iloc[i] == 1 and flag == 0:
flag = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324088.html
