我在一个数据集上尝试一些机器学习。我对Python中的pandas/numpy还比较陌生,所以我无法找到解决方案。我使用pandas的read_csv函数得到一个数据框。数据框如下所示
ID ATTR QUANTITY17 203 1417 201 817 111 1159 80 5178 82 16
我希望将这个数据框重塑/扁平化为如下形式:
ID | attr1 | attr2 | attr3 | totalQuantity..................goes on=========================================================== 17 | 203 | 201 | 111 | 23 (即ID等于17的总和) 159 | 80 | 0 | 0 | 5 178 | 82 | 0 | 0 | 16 ....
非常感谢提供一段代码。提前感谢
回答:
首先通过cumcount
创建用于透视的att
列。然后对df1
使用pivot
,对df2
使用groupby
和sum
。最后通过merge
将df1
与df2
合并,并使用fillna
填充为0
:
print df ID ATTR QUANTITY0 17 203 141 17 201 82 17 111 13 17 203 144 17 201 85 17 111 16 17 203 147 17 201 88 17 111 19 17 203 1410 17 201 811 17 111 112 159 80 513 178 82 16#添加att列用于计数组项目df['att'] = df.groupby('ID')['ID'].cumcount() + 1#使用att列透视dfdf1 = df.pivot(index='ID', columns='att', values='ATTR').reset_index()#在列名中添加'attr'字符串df1.columns = [df1.columns[0]] + ['attr' + str(col) for col in df1.columns[1:]] df2 = df.groupby('ID')['QUANTITY'].sum().reset_index()#与总和合并print pd.merge(df1, df2 , on=['ID']).fillna(0)
ID attr1 attr2 attr3 attr4 attr5 attr6 attr7 attr8 attr9 attr10 \0 17 203 201 111 203 201 111 203 201 111 203 1 159 80 0 0 0 0 0 0 0 0 0 2 178 82 0 0 0 0 0 0 0 0 0 attr11 attr12 QUANTITY 0 201 111 92 1 0 0 5 2 0 0 16