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

How do you create a pivot table with a limited number of new columns using pandas?

例如我有这个数据框:

emp_id 标签
a1 101
a1 102
a1 103
a1 104
a2 420
a2 17
a3 99
a3 100
a3 101

我想创建一个新的数据框,就像一个数据框 table,其中的列数是固定的,任何超过该限制的行都会被删除。

例如,如果我的列限制是 3,我想要的输出数据帧将是:

emp_id label_1 label_2 label_3
a1 101 102 103
a2 420 17
a3 99 100 101

a1 的第 4 个条目被删除,a2 的第 3 个条目是 NaN

我怎样才能达到这个结果?

您可以分组 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()

注意。我无法测试代码

类似的方法,我们可以使用groupby cumcount to enumerate emp_id, and use a pivot_table to go to wide format, but filter groups based on the specified limit. Then use Index.map来格式化列headers:

# 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

DataFrame 和导入:

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]
})