我有一个如下数据框:
idx prev_val val type
0 nan 8 a
1 nan 9 a
2 nan 7 a
0 nan 3 b
1 nan 1 b
0 nan 2 c
1 nan 7 c
2 nan 5 c
3 nan 4 c
我希望对于每种类型,对于idx> 0的每一行,将从上一行的prev_val
中获取val
的值。因此,新的数据框将是:
idx prev_val val type
0 nan 8 a
1 8 9 a
2 9 7 a
0 nan 3 b
1 3 1 b
0 nan 2 c
1 2 7 c
2 7 5 c
3 5 4 c
做到这一点的最佳方法是什么?
答案 0 :(得分:1)
您可以尝试使用np.where
:
df['prev_val']=np.where(df['idx']!=0, df.val.shift(),np.nan)
答案 1 :(得分:1)
在type
和shift
的{{1}}列上使用DataFrame.groupby
,然后使用val
将值分配给prev_val
列:>
boolean indexing
结果:
df.loc[df['idx'].gt(0), 'prev_val'] = df.groupby('type')['val'].shift()
答案 2 :(得分:0)
您可以使用groupby
和shift
df['prev_val'] = df.groupby('type')['val'].shift()
0 0 NaN 8 a
1 1 8 9 a
2 2 9 7 a
3 0 NaN 3 b
4 1 3 1 b
5 0 NaN 2 c
6 1 2 7 c
7 2 7 5 c
8 3 5 4 c
请注意,如@jezrael所述,如果每个组都以idx = 0开头,则此解决方案有效。
答案 3 :(得分:0)
最好是使用像这样的Pandas fillna函数:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
df.fillna(method='ffill')