在熊猫中乘以列值,但排除零值

时间:2020-03-04 21:29:25

标签: python pandas

我正在寻找一种将所有列的值相乘但排除具有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无效

3 个答案:

答案 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掩码。