Использование .drop с Pandas для удаления одной строки на значение - PullRequest
0 голосов
/ 24 марта 2020

Имеется код для отправки электронных писем, некоторые строки имеют одно и то же имя человека, которому отправляется электронное письмо, но каждая строка имеет уникальное значение. Я пытаюсь заставить его отправить одно электронное письмо со всеми значениями, где в столбце имени есть повторяющиеся ячейки с тем же именем, но со всеми уникальными значениями в этих строках.

Итак, я попытался создать дублированный фрейм данных, потянув строки с дублирующимися строками, чтобы упростить операторы if else. Поскольку, когда я отправляю электронные письма, они отправляют одни и те же значения в разные электронные письма несколько раз, я пытался сделать так, чтобы каждый раз, когда он отправлял электронное письмо, он отбрасывал строку используемого значения.

В конце кода вместо удаления одной строки из одного значения она сбрасывает каждую строку со значением.

import smtplib
import pandas as pd
import ssl
import xlrd

your_name = "Name Here"
your_email = "Email you using here"
your_password = "password to email here"
cc = input("Email of person you want to cc in email: ")

# for gmail change smtp-mail.outlook.com to smtp.gmail.com, 465
server = smtplib.SMTP_SSL('smtp-mail.outlook.com', 587)
server.ehlo()
server.login(your_email, your_password)

data = [['bob', 'testemail@gmail.com', 'howdy'], ['joe', 
'testemail@gmail.com', 'hi'], ['bill', 'testemail@gmail.com', 'hey'], 
['bob', 'testemail@gmail.com', 'hola'],['bob', 'testemail@gmail.com',    
'hello'], ['josh', 'testemail@gmail.com', 'yo'], ['austin', 
'testemail@gmail.com', 'cya']

df = pd.DataFrame(data, columns = ['Pending Action From', 'Email', 
'values'])



all_names = email_list['Pending Action From']
all_emails = email_list['Email']
all_values = email_list['values']

# Takes duplicate row based off same name
duplicateRowsDF = email_list[email_list.duplicated(['Pending Action From'])]
duplicateRowsDF.to_excel('DuplicateQARList.xlsx', index=False)
duplicateRowsDF = pd.read_excel('DuplicateQARList.xlsx')

# removes duplicate row based off same name and keeps first same name
email_list.drop_duplicates(subset='Pending Action From', keep="first", inplace=True)

# email_list.to_excel('TestQARList.xlsx')


duplicate_values = duplicateRowsDF['value']
duplicate_names = duplicateRowsDF['Pending Action From']

 # Create the email to send
def full_email():
    full_email = ("From: {0} <{1}>\n"
                  "To: {2} <{3}>\n"
                  "Cc: {4}\n"
                  "Subject: {5}\n\n"
                  "{6}"
                  .format(your_name, your_email, name, email, cc, 
subject, message))
# Create the email to send

# In the email field, you can add multiple other emails if you want
# all of them to receive the same text
try:
    server.sendmail(your_email, [email], full_email)
    print('Email to {} successfully sent!\n\n'.format(email))
except Exception as e:
    print('Email to {} could not be sent :( because {}\n\n'.format(email, str(e)))


for idx in range(len(email_list)):

    email = all_emails[idx]
    name = all_names[idx]
    value = all_values[idx]

    for i in range(len(duplicateRowsDF)):

        duplicate_value = duplicate_values[i]
        duplicate_name = duplicate_names[i]

        if name == duplicate_name and value != duplicate_value and duplicate_names[i] == duplicate_names[i]:



            message = value, duplicate_values[i]

            full_email()
            email_list = email_list.drop(value)



# Close the smtp server
server.close()

Пример созданных фреймов данных, он берет дубликаты с тем же именем в ожидающем действии из строки и помещает эти строки в другой фрейм данных.

Потребовалось только два, но предполагается, что данные будут взяты из всех значений имен, которые являются дубликатами. Он отправляет одно и то же электронное письмо, поскольку они являются дубликатами одного и того же человека, но он принимает все отдельные значения для этого одного человека.

1 Ответ

0 голосов
/ 26 марта 2020

В этом случае, по-видимому, вы хотите составить список всех значений строк для каждого, поэтому вместо того, чтобы обрабатывать их по одному и отбрасывать, вы можете объединить их и использовать pop, если вы хотите удалить каждый, или просто оперируйте сгруппированным фреймом данных

df.groupby(['Pending Action From','Email'], as_index=False).agg(list)

    Pending Action From Email   values
0   austin  testemail@gmail.com [cya]
1   bill    testemail@gmail.com [hey]
2   bob testemail@gmail.com [howdy, hola, hello]
3   joe testemail@gmail.com [hi]
4   josh    testemail@gmail.com [yo]
...