2016-08-03 35 views
1

我有这个数据帧有三列(IDkeyword如何修改数据帧,使每行存储其重复行的所有数据?

ID key word 
0 1 A Apple 
1 1 B Bug 
2 2 C Cat 
3 3 D Dog 
4 3 E Exogenous 
5 3 E Egg 

我想创造更多的keyword列-as necessary-将数据存储在keyword列时,有与重复行IDs

这是输出的一个片段

ID key_0 key_1 word_0 word_1 
0 1  A  B Apple  Bug 

注:在上面的输出中,ID1在数据帧出现过两次,所以与重复ID相关的"key""B"将存储在新列"key_1"。在复制ID1中找到的字Bug也将被存储在新列word_1中。

完整的输出应该像下面这样:在完整的输出

ID key_0 key_1 key_2 word_0  word_1 word_2 
0 1  A  B  NaN Apple   Bug  NaN 
1 2  C NaN  NaN  Cat   NaN  NaN 
2 3  D  E  E  Dog  Exogenous  Egg 

通知,ID3已经重复三次。第二个重复"E"key将存储在"key_1"列下,第三个重复"E"将存储在新列"key_2"中。这适用于同一个mannar中的文字"Exogenous""Egg"

我发现Alex's解决方案是有用的,但它仅适用于该key列:

df.groupby('ID')['key'].apply(
lambda s: pd.Series(s.values, index=['key_%s' % i for i in range(s.shape[0])])).unstack(-1) 

任何想法,我怎样才能使lambda函数适用于这两个keyword列?

谢谢

回答

1
df2 = df.set_index('ID').groupby(level=0).apply(lambda df: df.reset_index(drop=True)).unstack() 
df2.columns = df2.columns.set_levels((df2.columns.levels[1]).astype(str), level=1) 
df2.columns = df2.columns.to_series().str.join('_') 
df2 

enter image description here

0

可以使用Alex的解决方案后,使用CONCAT:

df1 = df.groupby('ID')['key'].apply(
lambda s: pd.Series(s.values, index=['key_%s' % i for i in range(s.shape[0])])).unstack(-1) 

df2 = df.groupby('ID')['word'].apply(
lambda s: pd.Series(s.values, index=['word_%s' % i for i in range(s.shape[0])])).unstack(-1) 

df3 = pd.DataFrame({'ID':df['ID'].unique()}) 

df_new = pd.concat([df1,df2,df3],axis=1) 
+0

这给出了一个错误.. 。TypeError:不能连接非NDFrame对象@Gaurav Dhama – MEhsan

+0

对不起,我忘记了unique()给了一个ndarray不是一个数据框。已经改变了答案来反映这一点。 –

0

pivot_table另一种解决方案:

df['cols'] = df.groupby('ID')['ID'].cumcount().astype(str) 
df1 = df.pivot_table(index='ID', columns='cols', values=['key','word'], aggfunc=''.join) 
df1.columns = ['_'.join(col) for col in df1.columns] 
print (df1) 
    key_0 key_1 key_2 word_0  word_1 word_2 
ID           
1  A  B None Apple  Bug None 
2  C None None Cat  None None 
3  D  E  E Dog Exogenous Egg 
相关问题