获取大熊猫假人中类别值的频率

时间:2020-05-15 05:26:49

标签: python pandas pandas-groupby categorical-data dummy-variable

我正在此处对数据实施一种热编码

Version  Cluster_Size     Hardware_type  
1.0.4     3              Aplha,Alpha,Aplha
1.0.2     3              Aplha,Beta,Aplha 
1.0.9     3              Aplha,Beta,Gama  

在df ['hardware_type']。str.get_dummies(sep =',')之后,我能够获得这样的数据帧

Version  Cluster_Size     Hardware_type      Alpha   Beta   Gama
1.0.4     3              Alpha,Alpha,Alpha     1       0      0
1.0.2     3              Alpha,Beta,Alpha      1       1      0
1.0.9     3              Alpha,Beta,Gama       1       1      1

这正是“一键编码”应该做的,但是我正在尝试实现类似的功能,其中我可以获取列显示在其各自单元格中的分类值。

Version  Cluster_Size     Hardware_type      Alpha   Beta   Gama
1.0.4     3              Alpha,Alpha,Alpha     3       0      0
1.0.2     3              Alpha,Beta,Alpha      2       1      0
1.0.9     3              Alpha,Beta,Gama       1       1      1

有没有办法做这样的事情? 谢谢您的时间。

1 个答案:

答案 0 :(得分:2)

如果使用Series.str.get_dummies,则没有有关计数的信息。

因此需要另一种解决方案-CounterDataFrame构造函数一起使用:

from collections import Counter
L = [Counter(x.split(',')) for x in df['Hardware_type']]
df = df.join(pd.DataFrame(L, index=df.index).fillna(0).astype(int))
print (df)
  Version  Cluster_Size      Hardware_type  Alpha  Beta  Gama
0   1.0.4             3  Alpha,Alpha,Alpha      3     0     0
1   1.0.2             3   Alpha,Beta,Alpha      2     1     0
2   1.0.9             3    Alpha,Beta,Gama      1     1     1

或者可以使用Series.str.splitDataFrame.stackSeriesGroupBy.value_counts解决方案,但是应该更慢(取决于数据,最好对其进行测试):

s = df['Hardware_type'].str.split(',', expand=True).stack()
df = df.join(s.groupby(level=0).value_counts().unstack(fill_value=0))
print (df)
  Version  Cluster_Size      Hardware_type  Alpha  Beta  Gama
0   1.0.4             3  Alpha,Alpha,Alpha      3     0     0
1   1.0.2             3   Alpha,Beta,Alpha      2     1     0
2   1.0.9             3    Alpha,Beta,Gama      1     1     1