如果标题不清楚,很抱歉,我遇到的这个问题有点难以总结。
我有一个列,其中包含一个事件在其峰值时的值。非峰值只是nan。
[np.nan, 30, np.nan, np.nan, 10, np.nan, np.nan, 20, np.nan]
第二列定义我们是处于事件A还是事件B
['A', 'A', 'A', 'A', 'B', 'B', 'A', 'A', 'A']
根据该值相对于其所属事件的索引,我想用相应的值"填充"事件。
[30, 30, 30, 30, 10, 10, 20, 20, 20]
由于前30个值的索引属于事件A的这个特定部分,我们用30填充该事件,依此类推
示例如下:
df = pd.DataFrame({'val': [np.nan, 30, np.nan, np.nan, 10, np.nan, np.nan, 20, np.nan],
'event': ['A', 'A', 'A', 'A', 'B', 'B', 'A', 'A', 'A']})
val event
1 NaN A
2 30.0 A
3 NaN A
4 NaN A
5 10.0 B
6 NaN B
7 NaN A
8 20.0 A
9 NaN A
我希望我的输出列是[30, 30, 30, 30, 10, 10, 20, 20, 20]
使用groupby.apply
:
df['output'] = df.groupby(df['event'].shift().ne(df['event']).cumsum())['val']
.apply(lambda x: x.fillna(x.max()))
print(df)
val event output
0 NaN A 30.0
1 30.0 A 30.0
2 NaN A 30.0
3 NaN A 30.0
4 10.0 B 10.0
5 NaN B 10.0
6 NaN A 20.0
7 20.0 A 20.0
8 NaN A 20.0