【问题标题】:Python column retains original updated 'NA'; never gets updated with floatPython 列保留原始更新的“NA”;永远不会用浮动更新
【发布时间】:2018-11-22 16:51:48
【问题描述】:

更新数据框列 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)”的更新,其中包括浮点值计算,或者来自“除了 ZeroDivisionError”的“NaN”。

【问题讨论】:

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


    【解决方案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'] 
    

    【讨论】:

    • 我为什么使用 iterrow(),Java 迭代编程太多年了,它还在我脑海中 :)
    【解决方案2】:

    您应该尽量避免 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
    

    【讨论】:

    • 谢谢,对了,data.frames 上的 Python 级别循环似乎运行有些不规则,感谢您的捕捉和赞扬,当 data.frame 级别函数更合适时,避免在 data.frame 上出现 Python 循环使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多