猿问

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

我有一个这样的数据框:


   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

任何帮助是极大的赞赏!非常感谢!


红颜莎娜
浏览 132回答 3
3回答

ibeautiful

这有点难以实现,这里我们可以使用groupbywith idxmaxs=(~df.Bool&df.Hour.eq(12)).iloc[::-1].groupby(df.Bool.iloc[::-1].cumsum()).transform('idxmax')df['result']=df.index>=s.iloc[::-1]dfOut[375]:&nbsp;&nbsp; &nbsp; &nbsp;Bool&nbsp; Hour&nbsp; result0&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False1&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False2&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; True3&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; True4&nbsp; &nbsp; True&nbsp; &nbsp; 12&nbsp; &nbsp; True5&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False6&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False7&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False8&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False9&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False10&nbsp; False&nbsp; &nbsp; 12&nbsp; &nbsp; True11&nbsp; &nbsp;True&nbsp; &nbsp; 24&nbsp; &nbsp; True

杨__羊羊

s连续创建一个 groupIDFalse并与它们分开True。Groupby on Hourequals12使用s. 使用变换sum和从每组的自下而上获取oncumsum的计数,并返回on和的值True12True0orBools = 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.BoolOut[905]:&nbsp; &nbsp; &nbsp;Bool&nbsp; Hour&nbsp; bfill_Bool0&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp;False1&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp;False2&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp; True3&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp; True4&nbsp; &nbsp; True&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp; True5&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp;False6&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp;False7&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp;False8&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp;False9&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp;False10&nbsp; False&nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp; True11&nbsp; &nbsp;True&nbsp; &nbsp; 24&nbsp; &nbsp; &nbsp; &nbsp; True

largeQ

IIUC,你可以这样做:s = df['Bool'].shift(-1)df['Result'] = df['Bool'] | s.where(s).groupby(df['Hour'].eq(12).cumsum()).bfill()输出:&nbsp; &nbsp; &nbsp;Bool&nbsp; Hour&nbsp; Result0&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False1&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False2&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp; True3&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp; True4&nbsp; &nbsp; True&nbsp; &nbsp; 12&nbsp; &nbsp; True5&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False6&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False7&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False8&nbsp; &nbsp;False&nbsp; &nbsp; 12&nbsp; &nbsp;False9&nbsp; &nbsp;False&nbsp; &nbsp; 24&nbsp; &nbsp;False10&nbsp; False&nbsp; &nbsp; 12&nbsp; &nbsp; True11&nbsp; &nbsp;True&nbsp; &nbsp; 24&nbsp; &nbsp; True
随时随地看视频慕课网APP

相关分类

Python
我要回答