计算熊猫中具有特定值的列数

时间:2020-10-07 15:08:54

标签: pandas

我正在寻找一种方法来统计熊猫中的行数。一个例子是:

 df = pd.DataFrame(data = {'A': [x,y, z], 'B':[z,y,x], 'C': [y,x,z] })

我想计算每行的重复次数,并根据特定条件将其添加到新列中:

Criteria 
C1 = x
C2 = y
C3 = z 

在上面的示例中,C3为[​​1,0,2],因为第0行中有一个'z',第1行中没有'z',第2行中有两个'z'。

茶几看起来像:

A   B   C | C1  C2  C3
x   z   y |  1   1   1
y   y   x |  1   2   0
z   x   z |  1   0   2

我如何在熊猫里做到这一点?

非常感谢!

2 个答案:

答案 0 :(得分:2)

你的意思是:

df.join(df.apply(pd.Series.value_counts, axis=1).fillna(0))

输出:

   A  B  C    x    y    z
0  x  z  y  1.0  1.0  1.0
1  y  y  x  1.0  2.0  0.0
2  z  x  z  1.0  0.0  2.0

答案 1 :(得分:1)

可以迭代这些值并沿轴1求和

df = pd.concat([df.eq(val).sum(1) for val in ['x', 'y', 'z']], axis=1)

    0   1   2
0   1   1   1
1   1   2   0
2   1   0   2

然后相应地重命名您的列名。

有关更一般的解决方案,请考虑使用np.unique属性并使用pd.Series.name属性。

pd.concat([df.eq(val).sum(1).rename(val) for val in np.unique(df)], axis=1)

    x   y   z
0   1   1   1
1   1   2   0
2   1   0   2

通过一些小调整,您可以拥有茶几

map_ = {'x':'C1', 'y':'C2', 'z':'C3'}
df.join(pd.concat([df.eq(i).sum(1).rename(map_[i]) for i in np.unique(df)], 1))

    A   B   C   C1  C2  C3
0   x   z   y   1   1   1
1   y   y   x   1   2   0
2   z   x   z   1   0   2