我有一个csv喜欢
A,B,C,D
1,2,,
1,2,30,100
1,2,40,100
4,5,,
4,5,60,200
4,5,70,200
8,9,,
在第1行和第4行中,C值缺失(NaN
)。我想分别从第2行和第5行中取出它们的值。 (首次出现相同的A,B值)。
如果找不到匹配的行,只需输入0(如最后一行) 预期的操作:
A,B,C,D
1,2,30,
1,2,30,100
1,2,40,100
4,5,60,
4,5,60,200
4,5,70,200
8,9,0,
使用fillna
我找到bfill: use NEXT valid observation to fill gap
,但NEXT
观察必须采用逻辑方式(查看col A,B值),而不仅仅是即将出现的C列值
答案 0 :(得分:0)
您必须先在df.groupby
和A
上致电B
,然后再应用bfill
功能:
In [501]: df.C = df.groupby(['A', 'B']).apply(lambda x: x.C.bfill()).reset_index(drop=True)
In [502]: df
Out[502]:
A B C D
0 1 2 30 NaN
1 1 2 30 100.0
2 1 2 40 100.0
3 4 5 60 NaN
4 4 5 60 200.0
5 4 5 70 200.0
6 8 9 0 NaN
你也可以分组,然后直接拨打dfGroupBy.bfill
(我认为这会更快):
In [508]: df.C = df.groupby(['A', 'B']).C.bfill().fillna(0).astype(int); df
Out[508]:
A B C D
0 1 2 30 NaN
1 1 2 30 100.0
2 1 2 40 100.0
3 4 5 60 NaN
4 4 5 60 200.0
5 4 5 70 200.0
6 8 9 0 NaN
如果您希望摆脱NaN
中的D
,您可以这样做:
df.D.fillna('', inplace=True)