将包含NaN的Pandas系列行相乘。

13 浏览
0 Comments

将包含NaN的Pandas系列行相乘。

给定这个数据框:\n

import pandas as pd
import numpy as np
data = {'column1': [True,False, False, True, True],
        'column2' : [np.nan,0.21, np.nan, 0.2222, np.nan],
        'column3': [1000, 0, 0, 0, 0 ]}
df = pd.DataFrame.from_dict(data)
print(df)

\n


\n

   column1  column2  column3
0     True      NaN     1000
1    False   0.2100        0
2    False      NaN        0
3     True   0.2222        0
4     True      NaN        0

\n当column2的行不是NaN时,我该如何将column2的结果与前一个column3的值相乘,否则只返回前一个column3的值?\n结果应该是这样的:\n

   column1  column2  column3
0     True      NaN     1000
1    False   0.2100        210
2    False      NaN        210
3     True   0.2222        46.662
4     True      NaN        46.662

\n我一直在浏览类似的问题,但我就是搞不明白...\n我将非常感谢您的帮助 🙂

0
0 Comments

问题的原因是在计算乘积时,如果某一行的值为NaN,则会导致整列的结果都变为NaN。解决方法是使用isnull()函数和at()方法来判断NaN值,并对NaN值进行特殊处理。

代码中首先创建了一个包含NaN值的DataFrame,然后通过遍历每一行的索引来进行计算。在遍历的过程中,使用isnull()函数判断当前行的column2列是否为NaN,如果是则将is_nan变量设为True,否则设为False。然后通过at()方法来获取前一行的column3的值,并根据is_nan的值来进行乘积计算。最后将计算结果赋值给当前行的column3列。

这样就能够避免NaN值对整列结果的影响,得到正确的计算结果。

输出结果如下:

column1 column2 column3

0 True NaN 1000

1 False 0.2100 210

2 False NaN 210

3 True 0.2222 46

4 True NaN 46

0
0 Comments

问题出现的原因是在对包含NaN的Pandas Series行进行乘法操作时,由于NaN的存在导致结果出现错误。解决方法是定义一个辅助类来累积column3的最后一个值,并使用map函数在行上进行计算,避免使用for循环,并且可以轻松地并行运行计算。

具体解决方法如下:

首先,定义一个AccumMult类,用于累积column3的最后一个值。该类具有一个成员变量last_val来保存最后一个值。

class AccumMult:
    def __init__(self):
        self.last_val = None
    def mult(self, c2, c3):
        self.last_val = c3 if self.last_val is None else self.last_val
        if not np.isnan(c2):
            self.last_val = self.last_val * c2
        return self.last_val

接下来,创建一个AccumMult类的实例m,并通过map函数在DataFrame的column2和column3上进行计算,并将结果赋值给column3。

m = AccumMult()
df["column3"] = list(map(lambda x: m.mult(x[0], x[1]), df[["column2", "column3"]].values.tolist()))

通过以上步骤,我们成功解决了在对包含NaN的Pandas Series行进行乘法操作时出现错误的问题。这种方法避免了使用for循环,并且可以将计算操作集中在map函数中,从而更容易实现并行计算。

0
0 Comments

出现的问题:在Pandas的Series中,存在NaN值的行进行相乘操作时,会出现错误。

解决方法:将所有的0值替换为NaN,并创建一个df的副本。然后,在column2不为空的情况下,在axis 1上进行前向填充(ffill),并过滤最后一列,然后进行累积乘积(cumprod)。最后,将结果前向填充(ffill)。

代码如下:

# 替换0为NaN,并创建df的副本
m = df.assign(column3=df.column3.replace(0, np.nan))
# 在column2不为空的情况下,在axis 1上进行前向填充,并过滤最后一列,然后进行累积乘积
final = (df.assign(column3=m.mask(m.column2.notna(), m.ffill(1)).iloc[:, -1].cumprod().ffill()))

以上是关于解决"Multiplying Pandas series rows containing NaN"问题的方法。

0