我正在寻找一种方法来统计熊猫中的行数。一个例子是:
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
我如何在熊猫里做到这一点?
非常感谢!
答案 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