Python 对给定行、列和列的分类要素标签求和
对df中每个实例的分类变量的标签计数求和(相同)的pythonic方法是什么? 例如: 在添加标签计数列后,应给出:Python 对给定行、列和列的分类要素标签求和,python,python-3.x,pandas,counter,Python,Python 3.x,Pandas,Counter,对df中每个实例的分类变量的标签计数求和(相同)的pythonic方法是什么? 例如: 在添加标签计数列后,应给出: 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
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
谢谢您可以对每行应用
pd.Series.value\u counts
函数,然后在将nan
s替换为零后,将计数连接到数据帧的第二个轴上
>>> 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
另一种方法是为每列使用虚拟变量,然后取它们的和:
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
如果您有大量行,我希望这会更有效。您可以使用标准库中的集合。计数器
:
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
@幸运的是,我们不在亚原子水平,因此我不期望有0.5个计数;)。这是宽数据集与长数据集问题的经典示例。当前,您有不同的指示符作为共享相同数据值的命名列,然后希望将值计数聚合为新列。最佳做法是将源数据重塑为可扩展且高效的长格式,然后运行groupby
value counts。
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