我有一个包含多列的数据集,我想进行一次热编码.但是,我不希望对它们中的每一个进行编码,因为所述列与所述项目相关.我想要的是一组使用所有列的虚拟变量.请参阅我的代码以获得更好的解释.
假设我的数据框看起来像这样:
In [103]: dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})
In [104]: dum
Out[104]:
ch1 ch2 ch3
0 A B C
1 C G D
2 A F E
Run Code Online (Sandbox Code Playgroud)
如果我执行
pd.get_dummies(dum)
Run Code Online (Sandbox Code Playgroud)
输出将是
ch1_A ch1_C ch2_B ch2_F ch2_G ch3_C ch3_D ch3_E
0 1 0 1 0 0 1 0 0
1 0 1 0 0 1 0 1 0
2 1 0 0 1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
但是,我想要获得的是这样的:
A B C D E F G
1 1 1 0 0 0 0
0 0 1 1 0 0 1
1 0 0 0 1 1 0
Run Code Online (Sandbox Code Playgroud)
代替具有表示编码,例如多列的ch1_A和ch1_C,我只希望有一组(A,B,等等)与值1时任何在列中的值的ch1,ch2,ch3显示出来.
为了澄清,在我的原始数据集中,单行不会包含相同的值(A,B,C ...)不止一次; 它只会出现在其中一列上.
使用stack和str.get_dummies
dum.stack().str.get_dummies().sum(level=0)
Out[938]:
A B C D E F G
0 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1
2 1 0 0 0 1 1 0
Run Code Online (Sandbox Code Playgroud)
您可以使用pd.crosstab创建频率表:
import pandas as pd
dum = pd.DataFrame({'ch1': ['A', 'C', 'A'], 'ch2': ['B', 'G', 'F'], 'ch3': ['C', 'D', 'E']})
stacked = dum.stack()
index = stacked.index.get_level_values(0)
result = pd.crosstab(index=index, columns=stacked)
result.index.name = None
result.columns.name = None
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
A B C D E F G
0 1 1 1 0 0 0 0
1 0 0 1 1 0 0 1
2 1 0 0 0 1 1 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2664 次 |
| 最近记录: |