我正在寻找一种将所有列的值相乘但排除具有0值的列的方法。因此,结果不应为0(乘以0)。如果有如此多的列和行,那很容易,但是如果有100列和5000行呢?
import pandas as pd
df = pd.DataFrame({"Col1":[6,4,3,0],
"Col2":[1,0,0,3],
"Col3":[2,4,3,2]})
因此结果应如下所示:
print(df)
# result should be multiplication of all column values, but not 0
# zeros should be excluded
6 * 1 * 2
4 * 4
3 * 3
3 * 2
df = pd.DataFrame({"Col1":[6,4,3,0],
"Col2":[1,0,0,3],
"Col3":[2,4,3,2],
"Result":[12,16,9,6]})
print(df)
我无法更改数据,因此将零更改为1无效
答案 0 :(得分:4)
您可以简单地将0替换为1。
df = pd.DataFrame({"Col1":[6,4,3,0],
"Col2":[1,0,0,3],
"Col3":[2,4,3,2]})
df['Result'] = df.replace(0,1).prod(axis=1)
Col1 Col2 Col3 Result
0 6 1 2 12
1 4 0 4 16
2 3 0 3 9
3 0 3 2 6
要获取技术知识-乘法1是identity function。另外,标识函数为0。对于 way 来说,它过于简单-标识函数只是一种说法:“通过添加另一个变量来返回相同的结果”。
要获得非技术性知识,我想到了“想一想不难”的报价
答案 1 :(得分:3)
可能只是将零值替换为一并乘以值:
df['Result'] = df.replace(0,1).apply(np.prod,axis=1)
答案 2 :(得分:2)
将简单掩码0
的值设置为NaN
并调用prod
df['Result'] = df.where(df.ne(0)).prod(1)
Out[1748]:
Col1 Col2 Col3 Result
0 6 1 2 12.0
1 4 0 4 16.0
2 3 0 3 9.0
3 0 3 2 6.0
或将0
屏蔽为1
df['Result'] = df.where(df.ne(0), 1).prod(1)
Out[1754]:
Col1 Col2 Col3 Result
0 6 1 2 12
1 4 0 4 16
2 3 0 3 9
3 0 3 2 6
逐步:
ne(0)
返回一个布尔掩码,其中0
被掩码为True
In [1755]: df.ne(0)
Out[1755]:
Col1 Col2 Col3 Result
0 True True True True
1 True False True True
2 True False True True
3 False True True True
where
检查布尔掩码的每个位置。在True
上,它保持不变。在False
上,当没有第二个参数时,它将变为NaN
。
In [1756]: df.where(df.ne(0))
Out[1756]:
Col1 Col2 Col3 Result
0 6.0 1.0 2 12
1 4.0 NaN 4 16
2 3.0 NaN 3 9
3 NaN 3.0 2 6
prod(1)
是沿轴= 1的乘积。 Prod
默认情况下忽略NaN
,因此它返回每行的乘积而无需考虑NaN
In [1759]: df.where(df.ne(0)).prod(1)
Out[1759]:
0 12.0
1 16.0
2 9.0
3 6.0
dtype: float64
为where
指定第二个参数时,它用于替换False
掩码。