我有这个示例数据框
ID1,ID2,info,Value
1,50,BA,101
1,50,BA,102
2,100,CA,03
2,100,CA,07
2,100,BA,09
2,100,BA,10
要重塑数据,我正在使用unstack,这更像是我想要的90%,它可以工作。
grouped = df.groupby(['ID1','ID1','ID2','info'])[['Value']].apply(lambda x: pd.DataFrame(x.values, columns=[['Value']]))\
.unstack().sort_index(level=1, axis=1).reset_index(drop= True, level=1).reset_index()
grouped.columns = ['{}{}'.format(a,b) for a, b in df_grouped.columns]
这就是我得到的结果
ID1,ID2,info,Value0,Value1
1,50,BA,101,102
2,100,BA,9,10
2,100,CA,3,7
如果我可以将所有ID1放在一行中,并且如果我有两个与ID1对应的不同信息值,那么可能会更清晰些
ID1,ID2,info,Value0,Value1,Value2,Value3
1,50,BA,101,102,,
2,100,[BA,CA],9,10,3,7
有什么建议吗?
答案 0 :(得分:1)
您的解决方案应首先通过汇总list
进行更改,然后在必要时仅将list的唯一值转换为set并返回到list,然后从另一个列创建join
并返回到DataFrame:
grouped = df.groupby(['ID1','ID1','ID2']).agg(list)
grouped['info'] = grouped['info'].apply(lambda x: list(set(x)))
df1 = pd.DataFrame(grouped.pop('Value').values.tolist(),
index=grouped.index).add_prefix('Value')
grouped = grouped.join(df1)
print (grouped)
info Value0 Value1 Value2 Value3
ID1 ID1 ID2
1 1 50 [BA] 101 102 NaN NaN
2 2 100 [BA, CA] 3 7 9.0 10.0