Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对给定行、列和列的分类要素标签求和_Python_Python 3.x_Pandas_Counter - Fatal编程技术网

Python 对给定行、列和列的分类要素标签求和

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

对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

谢谢

您可以对每行应用
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