Skip to main content
 首页 » 编程设计

python之Pandas 转出独特的专栏

2025年05月04日14zhengyun_ustc

我有一个 pandas 数据框,其中两个数据框的组合我认为是唯一标识符,然后是一个可以具有不同值的列“C”。因此,同一个唯一标识符可以重复的次数与其具有的不同“C”值的数量一样多。

import pandas as pd 
data = {'A' : ['000001','000001','000001','000001','000002','000002','000003'], 
       'B' : ['1A','1A','1C','1D','1A','1A','1D'], 
       'C' : ['003','012','016','003','020','012','053']} 
 
df = pd.DataFrame(data) 
 
+-------------------+ 
| A      | B  | C   |  
+-------------------+ 
| 000001 | 1A | 003 | 
| 000001 | 1A | 012 | 
| 000001 | 1C | 016 | 
| 000001 | 1D | 003 | 
| 000002 | 1A | 020 | 
| 000002 | 1A | 012 | 
| 000003 | 1D | 053 | 
+-------------------+ 

我想根据 A、B 对行进行分组,然后转出 C 列并将它们变成虚拟对象。这就是我需要的最终输出:

+----------------------------------------------------+ 
| A      | B  | C_003 | C_012 | C_016 | C_020 |C_053 | 
+----------------------------------------------------+ 
| 000001 | 1A | 1     | 1     | 0     | 0     | 0    |  
| 000001 | 1C | 0     | 0     | 1     | 0     | 0    |  
| 000001 | 1D | 1     | 0     | 0     | 0     | 0    |  
| 000002 | 1A | 0     | 1     | 0     | 1     | 0    |  
| 000003 | 1D | 0     | 0     | 0     | 0     | 1    |  
+----------------------------------------------------+ 

我真的不擅长数据透视表,但也不确定数据透视表是否能达到我想要的输出。我正在寻找一个 super 高效的过程,因为实际数据有更多列作为标识符的一部分(如 A、B)、数千个可能的 C 值和数百万行。有什么想法吗?

请您参考如下方法:

pandas.get_dummies 助您一臂之力。

pd.get_dummies(df.set_index(['A', 'B'])).reset_index() 
 
        A   B  C_003  C_012  C_016  C_020  C_053 
0  000001  1A      1      0      0      0      0 
1  000001  1A      0      1      0      0      0 
2  000001  1C      0      0      1      0      0 
3  000001  1D      1      0      0      0      0 
4  000002  1A      0      0      0      1      0 
5  000002  1A      0      1      0      0      0 
6  000003  1D      0      0      0      0      1 

或者……(感谢文提醒)

pd.get_dummies(df.set_index(['A', 'B'])).sum(level=[0, 1]).reset_index() 
 
        A   B  C_003  C_012  C_016  C_020  C_053 
0  000001  1A      1      1      0      0      0 
1  000001  1C      0      0      1      0      0 
2  000001  1D      1      0      0      0      0 
3  000002  1A      0      1      0      1      0 
4  000003  1D      0      0      0      0      1