pandas 追加重复项作为列

pandas append duplicates as columns

我有一个看起来像这样的 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(),但没有成功。

您可以对 index 中的 ID 列使用 cumcount for count duplicates with set_index + unstack for reshaping. Then convert MultiIndex to columns by map and last reset_index

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

pivot的解决方案:

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

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

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