基于两个条件的Python pandas数据框填充。

3

我有这样一个数据框:

   Bool   Hour
0  False  12
1  False  24
2  False  12
3  False  24
4  True   12
5  False  24
6  False  12
7  False  24
8  False  12
9  False  24
10 False  12
11 True   24

我希望能够在“Hour”首次达到“12”时将“Bool”列中的True值回填。结果可能会像这样:
   Bool   Hour  Result
0  False  12    False
1  False  24    False
2  False  12    True      <- desired backfill
3  False  24    True      <- desired backfill
4  True   12    True
5  False  24    False
6  False  12    False
7  False  24    False
8  False  12    False
9  False  24    False
10 False  12    True      <- desired backfill
11 True   24    True

任何帮助都非常感激!非常感谢!
3个回答

2

这有点难以实现,我们可以使用 groupbyidxmax

s=(~df.Bool&df.Hour.eq(12)).iloc[::-1].groupby(df.Bool.iloc[::-1].cumsum()).transform('idxmax')
df['result']=df.index>=s.iloc[::-1]
df
Out[375]: 
     Bool  Hour  result
0   False    12   False
1   False    24   False
2   False    12    True
3   False    24    True
4    True    12    True
5   False    24   False
6   False    12   False
7   False    24   False
8   False    12   False
9   False    24   False
10  False    12    True
11   True    24    True

在极端情况下,当最后一个 False 组没有可以填充 True 的值时,此时仍会填充 True 。;p - Andy L.

1
我理解为,您可以做以下操作:
s = df['Bool'].shift(-1)
df['Result'] = df['Bool'] | s.where(s).groupby(df['Hour'].eq(12).cumsum()).bfill()

输出:

     Bool  Hour  Result
0   False    12   False
1   False    24   False
2   False    12    True
3   False    24    True
4    True    12    True
5   False    24   False
6   False    12   False
7   False    24   False
8   False    12   False
9   False    24   False
10  False    12    True
11   True    24    True

1
创建一个名为s的组ID,将连续的False分组并与它们分开的True一起分组。按Hour等于12进行分组,并使用s。使用sumcumsum转换来获取每个组中从下往上在12上的True计数,并返回0上的True,并将Bool的值与or结合。
s = df.Bool.ne(df.Bool.shift()).cumsum()
s1 = df.where(df.Bool).Bool.bfill()
g = df.Hour.eq(12).groupby(s)
df['bfill_Bool'] = (g.transform('sum') - g.cumsum()).eq(0) & s1 | df.Bool

Out[905]:
     Bool  Hour  bfill_Bool
0   False    12       False
1   False    24       False
2   False    12        True
3   False    24        True
4    True    12        True
5   False    24       False
6   False    12       False
7   False    24       False
8   False    12       False
9   False    24       False
10  False    12        True
11   True    24        True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接