pandas将重复项附加为列

时间:2017-06-06 07:08:37

标签: python pandas concat

我有一个看起来像这样的df

         ID       data1     data2
 index
 1       1        3         4
 2       1        2         5
 3       2        9         3
 4       3        7         2
 5       3        4         7
 6       1        10        12

我要做的是将所有具有相同ID的行追加为列,以便我得到类似的内容

         ID       data2     data3    data4    data5    data6     data7
 index
 1       1        3         4        2        5        10        12        
 3       2        9         3
 4       3        7         2        4        7

问题是我不知道要添加多少列。 专栏。请注意,ID不是索引而是普通列,但是用于查找重复项的列。 我已经尝试了pd.concat(),但没有运气。

1 个答案:

答案 0 :(得分:1)

您可以使用cumcountset_index + unstack的重复计数进行重新整形。然后将MultiIndex转换为columns map,将ID转换为来自index的{​​{1}}列。

df['g'] = df.groupby('ID').cumcount().astype(str)
df = df.set_index(['ID','g']).unstack().sort_index(axis=1, level=1)
df.columns = df.columns.map('_'.join)
df = df.reset_index()
print (df)
   ID  data1_0  data2_0  data1_1  data2_1  data1_2  data2_2
0   1      3.0      4.0      2.0      5.0     10.0     12.0
1   2      9.0      3.0      NaN      NaN      NaN      NaN
2   3      7.0      2.0      4.0      7.0      NaN      NaN

reset_index的解决方案:

df['g'] = df.groupby('ID').cumcount().astype(str)
df = df.pivot(index='ID',columns='g').sort_index(axis=1, level=1)
df.columns = df.columns.map('_'.join)
df = df.reset_index()
print (df)
   ID  data1_0  data2_0  data1_1  data2_1  data1_2  data2_2
0   1      3.0      4.0      2.0      5.0     10.0     12.0
1   2      9.0      3.0      NaN      NaN      NaN      NaN
2   3      7.0      2.0      4.0      7.0      NaN      NaN

使用pivotDataFrame构造函数的另一种解决方案:

df = df.groupby('ID')['data1','data2']
       .apply(lambda x: pd.DataFrame(x.values, columns=['a','b']))
       .unstack()
       .sort_index(axis=1, level=1)
df.columns = df.columns.map('{0[0]}_{0[1]}'.format)
df = df.reset_index()
print (df)
   ID  a_0  b_0  a_1  b_1   a_2   b_2
0   1  3.0  4.0  2.0  5.0  10.0  12.0
1   2  9.0  3.0  NaN  NaN   NaN   NaN
2   3  7.0  2.0  4.0  7.0   NaN   NaN