我提出这个问题是为了为自己学习一种新方法。
我有一个如下数据框,
ID Value
0 1 10
1 1 12
2 1 14
3 1 16
4 1 18
5 2 32
6 2 12
7 2 -8
8 2 -28
9 2 -48
10 2 -68
11 3 12
12 3 1
13 3 43
我想将其转换为:
ID Value ID Value ID Value
0 1.0 10.0 2 32 3.0 12.0
1 1.0 12.0 2 12 3.0 1.0
2 1.0 14.0 2 -8 3.0 43.0
3 1.0 16.0 2 -28 NaN NaN
4 1.0 18.0 2 -48 NaN NaN
5 NaN NaN 2 -68 NaN NaN
一种解决方法,
打印
pd.concat([df[df['ID']==1].reset_index(drop=True),df[df['ID']==2].reset_index(drop=True),df[df['ID']==3].reset_index(drop=True)],axis=1)
但是我在考虑可以对每个groupby方法结果执行相同的concat
操作,而不是按值进行过滤吗?
任何更好/新的方法都会受到赞赏。
谢谢。
答案 0 :(得分:2)
是的,实际上,使用pd.concat
非常简单。
df = pd.concat({k : g.reset_index(drop=True) for k, g in df.groupby('ID')}, axis=1)
df.columns = df.columns.droplevel(0)
或者,Dark(现在已删除)答案中的一个小变化(这使您没有机会自动指定列后缀)-
pd.concat([g.reset_index(drop=True) for _, g in df.groupby('ID')], axis=1)
df
ID Value ID Value ID Value
0 1.0 10.0 2 32 3.0 12.0
1 1.0 12.0 2 12 3.0 1.0
2 1.0 14.0 2 -8 3.0 43.0
3 1.0 16.0 2 -28 NaN NaN
4 1.0 18.0 2 -48 NaN NaN
5 NaN NaN 2 -68 NaN NaN
但是,那些列名很糟糕。与其删除第一级,不如考虑将它们串联起来以形成第二级的pre / suf-fix。使用df.columns.map
对您来说应该是一个很好的练习。