我想转换这个数据帧:
A B C D
xx nan 2 3
xx 1 nan 2
yy 4 nan nan
yy nan 5 nan
yy nan 4 6
zz nan nan nan
zz nan 8 nan
zz nan 9 nan
zz 7 10 nan
进入最后一个(通过'A'列分组)
A B C D
xx 1 2 3
yy 4 5 6
zz 7 8 nan
我尝试使用groupby,fillna和apply但到目前为止没有结果。
我希望最终的数据框始终在任何可能的地方显示非纳米值和每个唯一“A”列值的第一个值。
我怎么能这样做?
答案 0 :(得分:2)
df = df.groupby('A', as_index=False).first()
备选方案是使用自定义函数的agg
,如果以后将解析this issue:
def f(x):
y = x.dropna()
return np.nan if y.empty else y.iat[0]
df = df.groupby('A', as_index=False).agg(f)
print (df)
A B C D
0 xx 1.0 2.0 3.0
1 yy 4.0 5.0 6.0
2 zz 7.0 8.0 NaN
答案 1 :(得分:1)
您可以使用bfill
+ drop_duplicates
(这将保留原始索引: - ))
df.groupby('A').bfill().drop_duplicates(['A'])
Out[597]:
A B C D
0 xx 1.0 2.0 3.0
2 yy 4.0 5.0 6.0
5 zz 7.0 8.0 NaN