python - Pandas for 循环没有用 iloc 正确更新行?
问题描述
我正在尝试编写一个脚本,该脚本将根据列重复项(“电子邮件”)遍历 df,并将信息从旧行更新到最新行(列 =“创建于”)。最近一行中的一些数据是 NaN,因此当该行不是 NaN 时,需要由旧行更新此数据。我的数据集非常大,有很多列。我已经按照正确的顺序对列表进行了排序:
crm_dupes_s = dupes_df.sort_values(["Email", "Created On"], ascending=False)
crm_dupes_s.head(25)
然后确保正确读取 NaN 值:
crm_dupes_nan = crm_dupes_s.replace('nan', np.NaN)
crm_dupes_nan.isna()
Full Name First Name Middle Name Last Name Status Email Created On
0 False False True True False False False
1 False False True False False False False
列出了以后循环迭代的列,但由于这些值没有被更新,所以取出了电子邮件:
cols_to_change = list(crm_dupes_nan.columns)
cols_to_change.remove('Email')
cols_to_change
[' Full Name',
'First Name',
'Middle Name',
'Last Name',
'Status',
'Created On']
最后这是我的for循环:
#Iterates through all rows
for i in range(0, crm_dupes_nan.shape[0]):
#If there is a value for Email
if not pd.isna(crm_dupes_nan.iloc[i-1, :]['Email']):
#If the row Email values are the same "duplicates" then execute cell value change
if crm_dupes_nan.iloc[i-1, :]['Email'] == crm_dupes_nan.iloc[i, :]['Email']:
for col in cols_to_change:
if not pd.isna(crm_dupes_nan.iloc[i-1, :][col]):
crm_dupes_nan.iloc[i-1, :][col] = crm_dupes_nan.iloc[i, :][col]
我知道前 3 行正确识别重复,但“iloc”函数没有改变 NaN 值?我尝试过“iat”、“set_value”、“replace”和“where”,但都遇到了各种问题。我的印象是“iloc”是任务和性能的首选方法。任何帮助将不胜感激!!!
Full Name First Name Middle Name Last Name Status Email Account Numbers Primary Account Number Business Phone Home Phone
0 Zac Daniels Zac NaN Hopkins Active zdaniels@gmail.com NaN 3452432.0 NaN NaN
1 Zac Daniels Zac NaN Hopkins Active zdaniels@gmail.com 13254512.0 4564534.0 (949) 803-8033 (817) 817-9177
2 Zach Fred Zach NaN Wilbern Active zFredericks@miami.com 45632532.0 12342313.0 (313) 313-3133 (313) 313-3133
解决方案
很难更改 pandas 数据帧的单个值,我怀疑这是开发人员故意的。pandas 的重点是高效地处理表格数据,而无需遍历行和列。当您使用 子集时crm_dupes_nan.iloc[i-1, :][col]
,您将获得不再与数据框绑定的变量,因此为其分配值将不起作用。
我想您可能需要查看 pd.groupby 来收集您的电子邮件组,使用您要填写的数据形成一个更新程序数据框,然后使用 pd.merge 或 pd.update 将 crm_dupes 中的 nan 值替换为更新程序值。留给读者练习的细节。:-)
推荐阅读
- javascript - 使用 vue JS 单击时显示组件
- postgresql - 通过它来过滤父子 ID 性能优化方式
- javascript - 为什么当我提交 jQuery UI 对话框的表单时,它会刷新页面?
- powerapps - 如何刷新代表上次收到的电子邮件的 PowerApps 应用程序字段的内容
- node.js - 用 sqlite3 找到最大值的最有效方法是什么
- wagtail - 鹡鸰标签。获取标签作为查询集
- sql - 在 SQL Server 中加入时将多行汇总为一
- powershell - 将 PSCustomObject 转换为 powershell 中的自定义类型
- c# - Is there a way to read and validate specified PDF text using ITextSharp?
- amazon-web-services - AWS DMS with AWS MSK(Kafka) CDC transactional changes