熊猫,仅合并同一组中的行

时间:2020-07-02 10:57:05

标签: python pandas

输入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   

2 个答案:

答案 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')