【问题标题】:How to loc 5 rows before and 5 rows after value 1 in column如何定位列中值 1 之前的 5 行和之后的 5 行
【发布时间】:2020-07-06 19:58:58
【问题描述】:

我有数据框,我想在标志值为 1 之前更改 5 行和 5 行之后的 loc。

df=pd.DataFrame({'A':[2,1,3,4,7,8,11,1,15,20,15,16,87],
                 'flag':[0,0,0,0,0,1,1,1,0,0,0,0,0]})

expect_output

df1_before =pd.DataFrame({'A':[1,3,4,7,8],
                 'flag':[0,0,0,0,1]})
df1_after =pd.DataFrame({'A':[8,11,1,15,20],
                 'flag':[1,1,1,0,0]})

对所有三个标志 1 执行相同的过程

【问题讨论】:

  • 您希望如何存储结果?在这里,我可以看到您需要 2 个数据帧作为第一个标志,但您是否希望循环执行?您是否对选定的行执行任何操作?
  • @Ben.T 是的,我将对选定的行执行一些操作
  • @Ben.T 简而言之,当在列标志中找到值为 1 时,获取前 5 行和后 5 行并处理,然后去查找下一个 1 并执行相同的操作.....

标签: python pandas pandas-groupby


【解决方案1】:

我认为一种简单的方法是遍历标志为 1 的索引并使用 loc 选择所需的行:

l = len(df)
for idx in df[df.flag.astype(bool)].index:
    dfb = df.loc[max(idx-4,0):idx]
    dfa = df.loc[idx:min(idx+4,l)]
    #do stuff

minmax 函数用于确保在前 5 行或后 5 行中有 flag=1 时不通过边界。另请注意,对于 loc,如果您想要 5 行,则需要在 idx 上使用 +/-4 以获得正确的段。

也就是说,根据您的实际 #do stuff 是什么,您可能想要改变策略。例如,您要计算 A 之后 5 行与之前 5 行的总和之间的差异。你可以使用rollingshift:

df['roll'] = df.rolling(5)['A'].sum()
df.loc[df.flag.astype(bool), 'diff_roll'] = df['roll'].shift(-4) - df['roll']
print (df)
     A  flag   roll  diff_roll
0    2     0    NaN        NaN
1    1     0    NaN        NaN
2    3     0    NaN        NaN
3    4     0    NaN        NaN
4    7     0   17.0        NaN
5    8     1   23.0       32.0 #=55-23, 55 is the sum of A of df_after and 23 df_before
6   11     1   33.0       29.0
7    1     1   31.0       36.0
8   15     0   42.0        NaN
9   20     0   55.0        NaN
10  15     0   62.0        NaN
11  16     0   67.0        NaN
12  87     0  153.0        NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 2015-09-28
    • 2021-12-23
    • 1970-01-01
    • 2019-09-06
    • 2018-07-24
    • 2019-01-27
    • 2020-10-08
    相关资源
    最近更新 更多