我正在尝试编写一个脚本,它将根据列重复(“email”)遍历df,并将信息从旧的行更新到最近的行(column=“Created on”)。最近一行中的一些数据是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\u 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的重点是高效地处理表格数据,而不必遍历行和列。当您使用
crm_dupes_nan.iloc[i-1, :][col]
来子集时,您得到的变量不再绑定到dataframe,因此为其赋值将不起作用。你知道吗我想你应该看看pd.groupby公司要收集您的电子邮件组,请使用您想要填写的数据形成一个更新程序数据框,然后使用pd.合并或者也许pd.更新用更新程序值替换crm\u dupes中的nan值。细节留给读者作为练习。:-)
相关问题 更多 >
编程相关推荐