将包含NaN的Pandas系列行相乘。
将包含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我将非常感谢您的帮助 🙂
问题的原因是在计算乘积时,如果某一行的值为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
问题出现的原因是在对包含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函数中,从而更容易实现并行计算。
出现的问题:在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"问题的方法。