如何在Pandas中动态透视未知取值的列?
Pandas动态透视Status列实现两种输出需求
输入数据
| ID | Status | Date |
|---|---|---|
| 1 | Online | 2022-06-31 |
| 1 | Offline | 2022-07-28 |
| 2 | Online | 2022-08-01 |
| 3 | Online | 2022-07-03 |
| 3 | None | 2022-07-05 |
| 4 | Offline | 2022-05-02 |
| 5 | Online | 2022-04-04 |
| 5 | Online | 2022-04-06 |
期望输出1:保留Date的逐行透视
| ID | Date | Online | Offline | None |
|---|---|---|---|---|
| 1 | 2022-06-31 | 1 | 0 | 0 |
| 1 | 2022-07-28 | 0 | 1 | 0 |
| 2 | 2022-08-01 | 1 | 0 | 0 |
| 3 | 2022-07-03 | 1 | 0 | 0 |
| 3 | 2022-07-05 | 0 | 0 | 1 |
| 4 | 2022-05-02 | 0 | 1 | 0 |
| 5 | 2022-04-04 | 1 | 0 | 0 |
| 5 | 2022-04-06 | 1 | 0 | 0 |
期望输出2:按ID合并计数的透视
| ID | Online | Offline | None |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 2 | 1 | 0 | 0 |
| 3 | 1 | 0 | 1 |
| 4 | 0 | 1 | 0 |
| 5 | 2 | 0 | 0 |
核心需求
事先未知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
相关产品推荐
相关产品推荐

