我是熊猫的新手。我正在尝试与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
有什么建议可以解决这个问题?
答案 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