对给定行,pandas的列中的分类特征标签求和

时间:2018-05-19 17:18:43

标签: python python-3.x pandas counter

对于df中每个实例的分类变量的标签计数总和(相同)的pythonic方法是什么? 例如:

qualityOfLife_df = pd.DataFrame([['A', 'Up', 'Up', 'Same'], 
                               ['B', 'Up', 'Down', 'Up'],
                                ['C', 'Down', 'Down', 'Down']],
                               columns = ['City', 'Crime', 'Pollution', 'Jobs'])
在添加标签计数列后,

应该给出:

  City Crime Pollution  Jobs  nUp  nDown  nSame
0    A    Up        Up  Same    2      0      1
1    B    Up      Down    Up    2      1      0
2    C  Down      Down  Down    0      3      0

谢谢

3 个答案:

答案 0 :(得分:1)

您可以在每行上应用pd.Series.value_counts函数,然后在将nan替换为零后将计数连接到dataframe的第二轴。

>>> counts = qualityOfLife_df.apply(pd.Series.value_counts, axis=1)[['Up', 'Down', 'Same']].fillna(0)
>>> pd.concat((qualityOfLife_df, counts), axis=1)
  City Crime Pollution  Jobs   Up  Down  Same
0    A    Up        Up  Same  2.0   0.0   1.0
1    B    Up      Down    Up  2.0   1.0   0.0
2    C  Down      Down  Down  0.0   3.0   0.0

同样如评论中所述,您可以使用astype(int)将浮点数转换为整数。我建议,为了进行内存优化,如果您要处理更大的数据集,请根据最大数量使用较小的整数类型,如np.int16np.int8计数可能会持有。

>>> pd.concat((qualityOfLife_df, counts.astype(int)), axis=1)
  City Crime Pollution  Jobs  Up  Down  Same
0    A    Up        Up  Same   2     0     1
1    B    Up      Down    Up   2     1     0
2    C  Down      Down  Down   0     3     0

答案 1 :(得分:1)

另一种方法是为每列使用虚拟变量,然后取其总和:

pd.get_dummies(qualityOfLife_df.loc[:, 'Crime':'Jobs']).groupby(lambda x: x.split('_')[1], axis=1).sum()
Out: 
   Down  Same  Up
0     0     1   2
1     1     0   2
2     3     0   0

如果您有大量行,我希望这会更有效。

答案 2 :(得分:0)

您可以使用标准库中的collections.Counter

from collections import Counter

counts = pd.DataFrame(df[['Crime', 'Pollution', 'Jobs']].apply(Counter, axis=1).tolist())\
           .fillna(0).astype(int)

df = df.join(counts)

print(df)

  City Crime Pollution  Jobs  Down  Same  Up
0    A    Up        Up  Same     0     1   2
1    B    Up      Down    Up     1     0   2
2    C  Down      Down  Down     3     0   0