![](/img/trans.png)
[英]How to convert the “rows” of a pandas Series into columns of a DataFrame?
[英]How to convert pandas dataframe rows into columns, based on category?
我有一個帶有類別變量和一些數字變量的pandas數據框。 像這樣的東西:
ls = [{'count':5, 'module':'payroll', 'id':2}, {'count': 53, 'module': 'general','id':2}, {'id': 5,'count': 35, 'module': 'tax'}, ]
df = pd.DataFrame.from_dict(ls)
df看起來像這樣:
df
Out[15]:
count id module
0 5 2 payroll
1 53 2 general
2 35 5 tax
我想將轉換(轉置是正確的單詞?)模塊變量分為列和按ID分組。 所以類似於:
general_count id payroll_count tax_count
0 53.0 2 5.0 NaN
1 NaN 5 NaN 35.0
一種方法是使用apply:
df['payroll_count'] = df.id.apply(lambda x: df[df.id==x][df.module=='payroll'])
但是,這有許多缺點:
費錢,花費太多時間
創建需要清理的工件和空數據框。
我覺得有一個更好的方法來實現這個與pandas groupby ,但無法找到更有效的同一操作的方法。 請幫忙。
您可以按列使用groupby
,這些列首先創建新index
和最后一column
。 然后需要aggreagate某種方式-我用mean
,然后一個轉換DataFrame
,以Series
由DataFrame.squeeze
(當時是不是在列多指標的必要,除去頂層)和重塑unstack
。 最后一個add_suffix
到列名:
df = df.groupby(['id','module']).mean().squeeze().unstack().add_suffix('_count')
print (df)
module general_count payroll_count tax_count
id
2 53.0 5.0 NaN
5 NaN NaN 35.0
使用pivot
另一個解決方案,然后需要通過list comprehension
從列中刪除Multiindex
:
df = df.pivot(index='id', columns='module')
df.columns = ['_'.join((col[1], col[0])) for col in df.columns]
print (df)
general_count payroll_count tax_count
id
2 53.0 5.0 NaN
5 NaN NaN 35.0
你可以使用set_index
和unstack
In [2]: df.set_index(['id','module'])['count'].unstack().add_suffix('_count').reset_index()
Out[2]:
module id general_count payroll_count tax_count
0 2 53.0 5.0 NaN
1 5 NaN NaN 35.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.