在 pandas df 中移动等于特定值的行
Shift rows in pandas df where equal to specific value
我不确定哪个是解决这个问题最有效的过程,所以我会很宽泛。我想 shift
并将 row
其中 ==
组合到特定值。对于下面的 df
,我想将 shift
rows
向上 ==
到 X
。但是我想把它和上面的字符串结合起来,而不是覆盖它。
注:我要shift
上的row
是每14th
row
。因此,每第 n 个 row
和 shift
向上 select 可能更容易?
df = pd.DataFrame({
'Value' : ['Foo','X','00:00','00:00','29:00','30:00','00:00','02:00','15:00','20:00','10:00','15:00','20:00','25:00'],
'Number' : [00,0,1,2,3,4,5,6,7,8,9,10,11,12],
})
val = ['X']
a = df[df.isin(val)].shift(-1)
df[df.isin(val)] = np.nan
out_df = a.combine_first(df)
输出:
Value Number
0 X 0.0
1 NaN 0.0
2 00:00 1.0
3 00:00 2.0
4 29:00 3.0
5 30:00 4.0
6 00:00 5.0
7 02:00 6.0
8 15:00 7.0
9 20:00 8.0
10 10:00 9.0
11 15:00 10.0
12 20:00 11.0
13 25:00 12.0
预期输出:
Value Number
0 Foo X 0.0
2 00:00 1.0
3 00:00 2.0
4 29:00 3.0
5 30:00 4.0
6 00:00 5.0
7 02:00 6.0
8 15:00 7.0
9 20:00 8.0
10 10:00 9.0
11 15:00 10.0
12 20:00 11.0
13 25:00 12.0
您可以尝试这样的操作:
df.groupby((df['Value'] != val[0]).cumsum())[['Value','Number']].agg({'Value':' '.join, 'Number':'sum'})
输出:
Value Number
Value
1 Foo X 0
2 00:00 1
3 00:00 2
4 29:00 3
5 30:00 4
6 00:00 5
7 02:00 6
8 15:00 7
9 20:00 8
10 10:00 9
11 15:00 10
12 20:00 11
13 25:00 12