输入DF:
df = pd.DataFrame({'A': ['one',np.nan,'two',np.nan],
'B': [np.nan,22,np.nan,44],
'group':[0,0,1,1]
})
print(df)
A B group
0 one NaN 0
1 NaN 22.0 0
2 two NaN 1
3 NaN 44.0 1
我想将这些行合并为一,将所有单元格合并在同一列中。但要考虑到群体。
当前拥有:
df=df.agg(lambda x: ','.join(x.dropna().astype(str))
).to_frame().T
print(df)
A B group
0 one,two 22.0,44.0 0,0,1,1
但是这种方式占用了所有行,而不仅仅是组
预期输出:
A B
0 one 22.0
1 two 44.0
答案 0 :(得分:3)
如果可能,简化每组使用的第一个非缺失值的解决方案:
df = df.groupby('group').first()
print(df)
A B
group
0 one 22.0
1 two 44.0
如果不是并且需要一般解决方案:
df = pd.DataFrame({'A': ['one',np.nan,'two',np.nan],
'B': [np.nan,22,np.nan,44],
'group':[0,0,0,1]
})
def f(x):
return x.apply(lambda x: pd.Series(x.dropna().to_numpy()))
df = df.set_index('group').groupby('group').apply(f).reset_index(level=1, drop=True).reset_index()
print(df)
group A B
0 0 one 22.0
1 0 two NaN
2 1 NaN 44.0
答案 1 :(得分:0)
df_a = df.drop('B', axis=1).dropna()
df_b = df.drop('A', axis=1).dropna()
pd.merge(df_a, df_b, on='group')