首页 > 解决方案 > pandas 获取分组 df 中列的频率

问题描述

我有一个看起来像这样的数据框:

import pandas as pd


df = pd.DataFrame({'Name' : ['A', 'A', 'B','C','C','C','D','D'],
                   'ID' : ['1', '1', '2','3','3','4','4','4'],
                   'duration' : ['600', '3000', '3000', '600', '3000', '3000', '600','3000']})

我想得到这样的东西:

Name ID 600 3000
 A    1  1   1
 B    2  0   1
 C    3  1   1
 C    4  0   1
 D    4  1   1

我尝试使用 groupby 似乎缺少一步

标签: pythonpandas

解决方案


您可以使用它pd.crosstab来执行此操作:

counts = pd.crosstab(index=[df["Name"], df["ID"]], columns=df["duration"])

# Remove the name of the column array. It throws some people off to look at
counts = counts.rename_axis(columns=None).reset_index()

print(counts)
         3000  600
Name ID           
A    1      1    1
B    2      1    0
C    3      1    1
     4      1    0
D    4      1    1

您还可以使用pivot_table另一种方法:

counts = df.pivot_table(
    index=["Name", "ID"], columns=["duration"], aggfunc="size", fill_value=0
)

counts = counts.rename_axis(columns=None)

print(counts)
         3000  600
Name ID           
A    1      1    1
B    2      1    0
C    3      1    1
     4      1    0
D    4      1    1

推荐阅读