Groupby行,连接和NaN值与数字之间的选择

时间:2018-02-16 14:33:32

标签: python pandas dataframe

我想转换这个数据帧:

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”列值的第一个值。

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

使用groupby + first

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