Панды для цикла не обновляют строки правильно с iloc? - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь написать скрипт, который будет перебирать 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_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

1 Ответ

0 голосов
/ 29 октября 2019

Трудно изменить отдельные значения панелей данных панд, что, как я подозреваю, является преднамеренным для разработчиков. Смысл панд заключается в эффективной работе с табличными данными без необходимости перебирать строки и столбцы. Когда вы вводите подмножество с помощью crm_dupes_nan.iloc[i-1, :][col], вы получаете переменную, которая больше не привязана к фрейму данных, поэтому присвоение ему значения не будет работать.

Я думаю, вам, возможно, придется взглянуть на pd.groupbyчтобы собрать группы электронной почты, сформируйте фрейм данных модуля обновления с данными, которые вы хотите заполнить, затем используйте pd.merge или, возможно, pd.update, чтобы заменить значения nan в crm_dupes значениями средства обновления. Детали оставлены в качестве упражнения для читателя. :-)

...