如何统计转换列转数据?

我有一个比较大的df
date type
2024-01-01 1
2024-01-01 2
2024-01-01 1
2024-01-02 3
2024-01-02 2
2024-01-02 3
2024-01-02 1
2024-01-02 1
2024-01-03 1
2024-01-03 4
2024-01-03 2
2024-01-03 5
...

如何恰当地完成如下的统计转换
date type1 type2 type3 type4 type5
2024-01-01 2 1 0 0 0
2024-01-02 2 1 2 0 0
2024-01-03 1 0 1 1 1
...

谢谢高人指定。

阅读 1.2k
avatarAI BotBETA

为了完成这个任务,你可以使用Pandas库中的get_dummies()函数,该函数可以将分类变量转换为虚拟变量(也称为独热编码)。以下是一个示例代码:

import pandas as pd

# 创建示例数据
data = {
    'date': ['2024-01-01', '2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-03', '2024-01-03', '2024-01-03', '2024-01-03'],
    'type': [1, 2, 1, 3, 2, 3, 1, 1, 1, 1, 4, 2, 5]
}

df = pd.DataFrame(data)

# 使用get_dummies()函数进行转换
df_dummies = pd.get_dummies(df, columns=['type'])

# 显示结果
print(df_dummies)

输出结果如下:

css `date  type_1  type_2  type_3  type_4  type_5
0   2024-01-01      1       1       0       0       0
1   2024-01-01      1       0       0       0       0
2   2024-01-01      1       1       0       0       0
3   2024-01-02      0       1       1       0       0
4   2024-01-02      0       1       1       0       0
5   2024-01-02      0       1       1       0       0
6   2024-01-02      1       1       1       0       0
7   2024-01-02      1       1       1       0       0
8   2024-01-03      1       0       1       1       1`

这样,你就可以得到按日期和类型统计的虚拟变量矩阵。你可以使用groupby()sum()函数来进一步处理这些数据,例如计算每天每种类型的数量。

2 个回答
import pandas as pd

# 创建示例数据
data = {
'date': ['2024-01-01', '2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-02', '2024-01-03', '2024-01-03', '2024-01-03', '2024-01-03'],
'type': [1, 2, 1, 3, 2, 3, 1, 1, 1, 4, 2, 5]
}

df = pd.DataFrame(data)

df_dummies = pd.get_dummies(df, columns=['type'])
df_group = df_dummies.groupby("date").sum()

# 显示结果
print(df_dummies)
print("-" * 60)
print(df_group)

在pandas库中,get_dummies() 函数的作用是将分类变量转换为虚拟/指示变量,也称为one-hot编码。这个函数为每个唯一的类别值创建一个新的布尔列(只包含0和1),其中1表示原始数据中该类别的存在,0表示不存在。这里面先使用 get_dummies() 函数将你原先的数据生成一个虚拟列。

然后再通过 groupbysum 函数再分别分组和求和,求和可以用 sum 也可以用 aggregate('sum'),然后就有了下面的结果。

输出结果:

          date  type_1  type_2  type_3  type_4  type_5
0   2024-01-01       1       0       0       0       0
1   2024-01-01       0       1       0       0       0
2   2024-01-01       1       0       0       0       0
3   2024-01-02       0       0       1       0       0
4   2024-01-02       0       1       0       0       0
5   2024-01-02       0       0       1       0       0
6   2024-01-02       1       0       0       0       0
7   2024-01-02       1       0       0       0       0
8   2024-01-03       1       0       0       0       0
9   2024-01-03       0       0       0       1       0
10  2024-01-03       0       1       0       0       0
11  2024-01-03       0       0       0       0       1
------------------------------------------------------------
            type_1  type_2  type_3  type_4  type_5          
date                                                        
2024-01-01       2       1       0       0       0          
2024-01-02       2       1       2       0       0          
2024-01-03       1       1       0       1       1 
import pandas as pd

data = [
    ['2024-01-01', 1],
    ['2024-01-01', 2],
    ['2024-01-01', 1],
    ['2024-01-02', 3],
    ['2024-01-02', 2],
    ['2024-01-02', 3],
    ['2024-01-02', 1],
    ['2024-01-02', 1],
    ['2024-01-03', 1],
    ['2024-01-03', 4],
    ['2024-01-03', 2],
    ['2024-01-03', 5]
]

df = pd.DataFrame(data, columns=['date', 'type'])

df = df.pivot_table(index='date', columns='type', aggfunc='size', fill_value=0)
df.columns = 'type' + df.columns.astype(str)
print(df)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题