You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中动态透视未知取值的列?

Pandas动态透视Status列实现两种输出需求

输入数据

IDStatusDate
1Online2022-06-31
1Offline2022-07-28
2Online2022-08-01
3Online2022-07-03
3None2022-07-05
4Offline2022-05-02
5Online2022-04-04
5Online2022-04-06

期望输出1:保留Date的逐行透视

IDDateOnlineOfflineNone
12022-06-31100
12022-07-28010
22022-08-01100
32022-07-03100
32022-07-05001
42022-05-02010
52022-04-04100
52022-04-06100

期望输出2:按ID合并计数的透视

IDOnlineOfflineNone
1110
2100
3101
4010
5200

核心需求

事先未知Status列的具体取值,需动态生成透视后的列。


解决方案

实现期望输出1

使用pd.get_dummies自动识别所有Status取值,生成哑变量后与原表合并:

import pandas as pd

# 构造输入DataFrame(实际场景可从文件读取)
df = pd.DataFrame({
    'ID': [1,1,2,3,3,4,5,5],
    'Status': ['Online','Offline','Online','Online','None','Offline','Online','Online'],
    'Date': ['2022-06-31','2022-07-28','2022-08-01','2022-07-03','2022-07-05','2022-05-02','2022-04-04','2022-04-06']
})

# 生成Status的哑变量,自动覆盖所有可能的取值
status_dummies = pd.get_dummies(df['Status'])
# 合并ID、Date与哑变量列
result1 = pd.concat([df[['ID', 'Date']], status_dummies], axis=1)

此方法无需手动指定Status的取值,会根据数据自动生成对应的列,完全适配动态需求。

实现期望输出2

方法1:使用pivot_table动态聚合

# 按ID分组,对Status的不同取值计数,缺失值填充为0
result2 = df.pivot_table(
    index='ID',
    columns='Status',
    values='Date',  # 任意非空列均可用于计数
    aggfunc='count',
    fill_value=0
).reset_index()

pivot_table会自动识别所有Status的取值作为列名,无需预先定义。

方法2:groupby结合get_dummies求和

# 按ID分组后,对每组的Status生成哑变量并求和
result2 = df.groupby('ID')['Status'].apply(
    lambda x: pd.get_dummies(x).sum()
).reset_index()

两种方法均能实现按ID合并计数的效果,且均支持动态识别Status的所有可能取值。


内容的提问来源于stack exchange,提问作者Shan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:50:25