在Pandas中按组回填列

时间:2017-08-23 10:43:00

标签: python pandas dataframe

我有一个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列值

1 个答案:

答案 0 :(得分:0)

您必须先在df.groupbyA上致电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)