首页 > 解决方案 > Python 列保留原始更新的“NA”;永远不会用浮动更新

问题描述

更新数据框列 FractionOfVote 时,我的第一步是添加一个具有默认 NA 值的新列 FractionOfVote。然后使用 split 解析数据框列 Votes。

以下两个函数代码工作正常:1)add_new_column_fraction(),2)add_new_column_votes()。

def add_new_column_fraction(df):
    df['FractionOfVote'] = 'NA'

def add_new_column_votes(df):
    df[['YesVotes','NumVotes']] = df['Votes'].str.split('/',expand=True)[[0,1]]

问题代码在函数 calc_fraction_ratio_for_votes() 中找到

def calc_fraction_ratio_for_votes(df):
    for idx, row in df.iterrows():
        numerator = row['YesVotes']
        denomerator = row['NumVotes']
        try:
            row['FractionOfVote'] = float(numerator) / float(denomerator)
        except ZeroDivisionError:
            row['FractionOfVote'] = 'NaN'

此函数采用另外两个数据框列 YesVotes、NumVotes,并为之前在 add_new_column_fraction() 中定义的新列 FractionOfVote 计算新的浮点值。

逻辑错误是 FractionOfVote 列保留了原始更新的“NA”;并且从未收到来自“row['FractionOfVote'] = float(numerator) / float(denomerator)”的更新,其中包括浮点值计算,或来自“除了 ZeroDivisionError”的“NaN”。

标签: pythonpython-3.xpandasseriesdivide-by-zero

解决方案


你为什么首先使用iterrrows()?您可以通过矢量化实现获得相同的结果,如下所示:

 # Create column and fill all values to NaN by default
 df['FractionOfVote'] = np.nan # import numpy as np if you didn't

 # Populate the valid values with the ratio.
 df.loc[df['NumVotes'].astype(float) > 0, 'FractionOfVote'] = df['YesVotes'] / df['NumVotes'] 

推荐阅读