熊猫合并具有相同值和具有多个空值的相同索引的行

时间:2019-08-17 12:14:16

标签: python-3.x pandas pandas-groupby

我是熊猫的新手。我正在尝试与this答案相同的内容。

我有类似

的数据
[4]

我想要

之类的数据
SubjectID       Visit    Value1    Value2    Value3
                 1         1.57      1.75     1.56   
                 1         1.56       N/A     N/A 
    B1           2         N/A       1.56     N/A

我尝试过的是

SubjectID       Visit    Value1    Value2    Value3
                 1     1.57,1.56      1.75     1.56    
    B1           2         N/A       1.56     N/A  

有什么建议可以解决这个问题?

2 个答案:

答案 0 :(得分:3)

GroupBy.agg与自定义lambda函数一起使用,并通过Series.dropna删除丢失的值并将其强制转换为字符串,如果缺少所有值,则返回np.nan

f = lambda val: np.nan if val.isna().all() else ','.join(val.dropna().astype(str))
df = df.groupby(['SubjectID', 'Visit']).agg(f).reset_index()
print (df)
  SubjectID  Visit     Value1  Value2  Value3
0                1  1.57,1.56    1.75    1.56
1        B1      2        NaN    1.56     NaN

如果需要空字符串而不是缺少值,则解决方案更简单:

f = lambda val: ','.join(val.dropna().astype(str))
df1 = df.groupby(['SubjectID', 'Visit']).agg(f).reset_index()
print (df1)
  SubjectID  Visit     Value1  Value2 Value3
0                1  1.57,1.56    1.75   1.56
1        B1      2               1.56       

答案 1 :(得分:1)

使用groupby并加入同一组中的值:

(
    df.fillna('')
    .astype(str).groupby(by=['SubjectID', 'Visit'])
    .agg(lambda x: ','.join(x.loc[x!='']))
    .reset_index()
)

    SubjectID   Visit   Value1      Value2  Value3
0               1       1.57,1.56   1.75    1.56
1   B1          1                   1.56