2017-06-06 96 views
1

我有一个看起来像这样大熊猫追加重复栏目

  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 

一个DF我试图做的追加是列所有具有相同的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

您可以使用cumcountset_index + unstack重复计数。然后将MultiIndex转换为columnsmap并且最后reset_indexID来自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 
+0

它的工作原理几乎完美,但我有一个小问题:第一个索引(现ID)被存储为NaN。它是否仍然可以与索引一起存储,并且该ID是普通列? – Hamperfait

+0

Firt列是索引,对于列需要添加'df = df.reset_index()','print(df)'。 'ID'列包含'NaN'值? – jezrael

+0

或'ID'中的所有值都更改为'NaN's? – jezrael