Python列保留原始更新的“ NA”;永远不会用float更新

时间:2018-11-22 16:51:49

标签: python python-3.x pandas series divide-by-zero

在更新数据框列FractionOfVote时,我的第一步是添加一个默认值的新列FractionOfVote NA值。然后使用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”;并且从未收到带有浮点值计算或“ ZeroDivisionError除外”的“ NaN”的“ row ['FractionOfVote'] = float(分子)/ float(denomerator)”的更新。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

let topFlopVC: TopFlopVC = dependency.makeVC()

然后使用除法并将FUTEX_WAIT_PRIVATE替换为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