python - Python 列保留原始更新的“NA”;永远不会用浮动更新
问题描述
更新数据框列 FractionOfVote 时,我的第一步是添加一个具有默认 NA 值的新列 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,并为之前在 add_new_column_fraction() 中定义的新列 FractionOfVote 计算新的浮点值。
逻辑错误是 FractionOfVote 列保留了原始更新的“NA”;并且从未收到来自“row['FractionOfVote'] = float(numerator) / float(denomerator)”的更新,其中包括浮点值计算,或来自“除了 ZeroDivisionError”的“NaN”。
解决方案
你为什么首先使用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']
推荐阅读
- python - super().__new__(cls, *args, **kwargs),报错TypeError: object()不带参数
- laravel - Yajra DataTable 未安装在 Laravel 5.7 上。*
- java - XMLBeans 更改默认生成的 .xsb 文件位置
- python - TypeError:预期的 str、字节或 os.PathLike 对象,而不是 _io.TextIOWrapper
- python - 用 Python 区分特定格式的文本
- php - 使用谷歌图表构建数据透视表
- ios - UIMenuController 未显示
- java - 从某个键的映射中获取值并将其作为另一个条目集添加到另一个映射中
- javascript - 在视频背景上添加静音/取消静音按钮 [DIVI 主题 - WordPress]
- asp.net-mvc - ASP.NET MVC 生命周期中的慢进程