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

2024-04-18 09:42:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据框,其中有一个category变量和一些number变量。像这样的:

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有更好的方法来实现这一点,但是找不到更有效的方法来实现同样的操作。请帮忙。


Tags: 数据方法idnumberpandasdfcountnan
2条回答

你可以使用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

您可以使用^{}by列,这些列首先创建新的index,最后创建column。然后以某种方式需要aggreagate—我使用^{},然后通过^{}将一列DataFrame转换为Series(然后不需要删除列中多索引的顶层),并通过^{}重塑。最后一个^{}到列名:

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

使用^{}的另一个解决方案,然后需要通过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

相关问题 更多 >