2017-06-06 78 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