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

时间:2019-09-25 17:58:23

标签: python pandas dataframe boolean

我有一个这样的数据框:

   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

,我想在“布尔”栏中回填“真”值,直到“小时”首次达到“ 12”。结果将是这样的:

   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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

IIUC,您可以这样做:

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

答案 2 :(得分:1)

在连续的s上创建一个groupID False,并将True与它们分开。 Hour上的Groupby通过使用12等于s。使用变换sumcumsum从每个组的下至上获取True12的计数,并在True上返回0 or的值为Bool

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