如何使用pandas创建具有有限数量新列的透视表?

2024-04-26 18:12:38 发布

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

例如,我有这个数据帧:

^{tb1}$

我想创建一个新的dataframe,它类似于一个pivot表,其中列的数量是固定的,任何超过该限制的行都会被删除

例如,如果我的列限制为3,则我所需的输出数据帧为:

^{tb2}$

其中a1的第四个条目被删除,a2的第三个条目是NaN

我怎样才能达到这个结果


2条回答

您可以按emp_id分组并使用cumcount:

df['group'] = df.groupby('emp_id').cumcount().add(1)

现在,您应该有一个新的列,其名称用作轴。您只能保留所需的标签并执行透视

比如:

df = df[df['group'].le(3)]
df.pivot(index='emp_id', columns='group', values='label')
df.columns = df.columns.astype(str).add_prefix('label_')
df = df.reset_index()

NB。我无法测试代码

类似的方法,我们可以使用^{}枚举emp_id,并使用^{}转到宽格式,但根据指定的限制筛选组。然后使用^{}格式化列标题:

# Set limit
limit = 3
# Create Groups
groups = df.groupby('emp_id').cumcount() + 1
# Pivot to wide format with new columns
df = df.pivot_table(index='emp_id',
                    columns=groups[groups.le(limit)],  #  Limit groups
                    values='label')
# Update Column Labels
df.columns = df.columns.map('label_{:.0f}'.format)
# Reset Index
df = df.reset_index()

df

  emp_id  label_1  label_2  label_3
0     a1    101.0    102.0    103.0
1     a2    420.0     17.0      NaN
2     a3     99.0    100.0    101.0

数据帧和导入:

import pandas as pd

df = pd.DataFrame({
    'emp_id': ['a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a3', 'a3'],
    'label': [101, 102, 103, 104, 420, 17, 99, 100, 101]
})

相关问题 更多 >