簡體   English   中英

如何根據類別將pandas數據幀行轉換為列?

[英]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'])

但是,這有許多缺點:

  1. 費錢,花費太多時間

  2. 創建需要清理的工件和空數據框。

我覺得有一個更好的方法來實現這個與pandas groupby ,但無法找到更有效的同一操作的方法。 請幫忙。

您可以按列使用groupby ,這些列首先創建新index和最后一column 然后需要aggreagate某種方式-我用mean ,然后一個轉換DataFrame ,以SeriesDataFrame.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_indexunstack

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM