在 pandas df 中移动等于特定值的行

Shift rows in pandas df where equal to specific value

我不确定哪个是解决这个问题最有效的过程,所以我会很宽泛。我想 shift 并将 row 其中 == 组合到特定值。对于下面的 df,我想将 shift rows 向上 ==X。但是我想把它和上面的字符串结合起来,而不是覆盖它。

注:我要shift上的row是每14throw。因此,每第 n 个 rowshift 向上 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
​