我有看起来像这样的数据框:
df = pd.DataFrame({'Event': ['A', 'B', 'A', 'A', 'B', 'C', 'B', 'B', 'A', 'C'], 'Direction': ['UP', 'DOWN', 'UP', 'UP', 'DOWN', 'DOWN', 'DOWN', 'UP', 'DOWN', 'UP'], 'group':[1,2,3,3,3,4,4,4,5,5]})
一切正常,当我这样做时:
df['prev'] = df[(df.Event == 'A') & (df.Direction == 'UP')].groupby('group').cumcount().add(1) df['prev'].fillna(0, inplace=True)
但是,如果我在一行中执行此操作,则 fillna() 函数将不起作用:
df['prev'] = df[(df.Event == 'A') & (df.Direction == 'UP')].groupby('group').cumcount().add(1).fillna(0)
我的问题是:为什么会这样?有没有办法在一条线上做到这一点?
看这一步的输出:
print(df[(df.Event == 'A') & (df.Direction == 'UP')].groupby('group').cumcount().add(1)) # Output: 0 1 2 1 3 2 dtype: int64
您看到nan要填写的值吗?在这里添加.fillna(0)会做任何事情吗?
nan
.fillna(0)
一个可以工作的班轮:
df['prev'] = df.assign(prev = df[(df.Event == 'A') & (df.Direction == 'UP')].groupby('group').cumcount().add(1))['prev'].fillna(0)