Jac*_*ack 3 python python-3.x pandas
我有一个数字DataFrame,例如:
x = np.array([[1,2,3],[-1,-1,1],[0,0,0]])
df = pd.DataFrame(x, columns=['A','B','C'])
df
A B C
0 1 2 3
1 -1 -1 1
2 0 0 0
Run Code Online (Sandbox Code Playgroud)
我想为每一行计算正值,负值和等于0的值。我一直在尝试以下方法:
df['positive_count'] = df.apply(lambda row: (row > 0).sum(), axis = 1)
df['negative_count'] = df.apply(lambda row: (row < 0).sum(), axis = 1)
df['zero_count'] = df.apply(lambda row: (row == 0).sum(), axis = 1)
Run Code Online (Sandbox Code Playgroud)
但是我得到以下结果,这显然是不正确的
A B C positive_count negative_count zero_count
0 1 2 3 3 0 1
1 -1 -1 1 1 2 0
2 0 0 0 0 0 5
Run Code Online (Sandbox Code Playgroud)
任何人都知道可能出了什么问题,或者可以帮助我找到最好的方法来做我要寻找的东西?
谢谢。
有一些方法,但是一种选择是使用np.sign和get_dummies:
u = (pd.get_dummies(np.sign(df.stack()))
.sum(level=0)
.rename({-1: 'negative_count', 1: 'positive_count', 0: 'zero_count'}, axis=1))
u
negative_count zero_count positive_count
0 0 0 3
1 2 0 1
2 0 3 0
df = pd.concat([df, u], axis=1)
df
A B C negative_count zero_count positive_count
0 1 2 3 0 0 3
1 -1 -1 1 2 0 1
2 0 0 0 0 3 0
Run Code Online (Sandbox Code Playgroud)
np.sign 将零与正负值区别对待,因此在这里使用是理想的。
另一种选择是groupby和value_counts:
(np.sign(df)
.stack()
.groupby(level=0)
.value_counts()
.unstack(1, fill_value=0)
.rename({-1: 'negative_count', 1: 'positive_count', 0: 'zero_count'}, axis=1))
negative_count zero_count positive_count
0 0 0 3
1 2 0 1
2 0 3 0
Run Code Online (Sandbox Code Playgroud)
稍微冗长一些,但仍然值得了解。
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |