在更新数据框列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)”的更新。
答案 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