对于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
谢谢
答案 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.int16
或np.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