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']
更新数据框列 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']