Pandas for 循环不能用iloc正确地更新行?

1 人关注

我想写一个脚本,根据重复列("Emails")在df中进行迭代,并将信息从较旧的行更新到最近的行(列="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_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