Python 列保留原始更新'NA';永远不会用浮动更新

Python column retains original updated 'NA'; never gets updated with float

更新数据框列 FractionOfVote 时,我的第一步是添加一个新列 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,并计算新的浮点值 列 FractionOfVote,之前在 add_new_column_fraction() 中定义。

逻辑错误是 FractionOfVote 列保留了原始更新 'NA';并且从未收到来自 "row['FractionOfVote'] = float(numerator) / float(denomerator)" 的浮点值计算更新,或来自 "except ZeroDivisionError".

的 'NaN'

您应该尽量避免 Python 级循环。首先确保您的系列是数字的(如有必要):

df = pd.DataFrame({'Yes': [0, 3, 0, 10, 0],
                   'Num': [0, 5, 0, 30, 2]})

num_cols = ['Yes', 'Num']
df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce')

然后用除法把inf换成NaN:

print((df['Yes'] / df['Num']).replace(np.inf, np.nan))

0         NaN
1    0.600000
2         NaN
3    0.333333
4    0.000000
dtype: float64

你为什么首先使用 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']