es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cómo filtrar un objeto DF groupby a una lista

Estoy filtrando un dataframe y enviando los resultados de la información en un correo electrónico usando smtplib. Esto es lo que tengo hasta ahora.

“`Python
def SMTP_Emailer(content, receiver):
msg = EmailMessage()
msg[‘Subject’] = “¡Correo de prueba!”
msg[‘From’] = ‘test@example.com’
msg[‘To’] = [receiver]

msg.set_content( f"""Este es un correo de prueba, favor de ignorar{content}""", subtype='html')

with smtplib.SMTP('sendsmtp.server.com', 1234) as s:
    s.send_message(msg)

Tengo un dataframe de pandas así:

d =
STATE CUSTOMER ORDERS EMAIL OWNER
0 ID Jerry 10 Jerry@example.com
1 MT Tom 119 Jerry@example.com
2 CA Patrick 87 Jerry@example.com
3 WA Lucy 918 Mark@example.com

Luego, agrupo por la serie d[‘EMAIL OWNER’]

grouped = df.groupby(“EMAIL TEST”)
for emails, data in grouped:
print(emails)
dataframes = [emails for e, group in grouped]
print(dataframes)
SMTP_Emailer(data.loc[:, :].to_html(), dataframes)

Espero obtener [‘Jerry@example.com ‘, ‘Mark@example.com ‘] para poder ponerlos en msg[‘To’]

pero inesperadamente obtengo [‘Mark@example.com’,’Mark@example.com’] en VS Code

y en jupyter notebook obtengo:
Mark@example.com
[‘Mark@example.com’, ‘Mark@example.com’]
Jerry@example.com
[‘Jerry@example.com’, ‘Jerry@example.com’]

El resultado esperado es que ocurran 2 correos electrónicos separados. Usé el groupby para filtrar desde la fuente de datos principal (d) por la dirección de correo electrónico de las personas para que solo vean lo que les pertenece y no lo de la otra persona. Entonces, Mark no vería los datos de Jerry (y viceversa).

Avísame si esto ayuda a aclarar las cosas.

Email 1 se envía a Jerry@example.com

Estado CLIENTE PEDIDOS CORREO DEL DUEÑO
0 ID Jerry 10 Jerry@example.com
1 MT Tom 119 Jerry@example.com
2 CA Patrick 87 Jerry@example.com

Email 2 se envía a Mark@example.com

3 WA Lucy 918 Mark@example.com

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema parece estar en cómo se define la lista dataframes en el bucle for. En lugar de usar la lista dataframes, puedes usar directamente la variable emails para actualizar el campo To del mensaje de correo electrónico.

    Aquí tienes el código modificado que debería funcionar:

    from email.message import EmailMessage
    import smtplib
    
    def SMTP_Emailer(content, receiver):
        msg = EmailMessage()
        msg['Subject'] = "¡Email de prueba!"
        msg['From'] = 'test@example.com'
        msg['To'] = receiver
    
        msg.set_content(
            f"""Este es un correo electrónico de prueba, por favor ignóralo
            {content}""",
            subtype='html')
    
        with smtplib.SMTP('sendsmtp.server.com', 1234) as s:
            s.send_message(msg)
    
    
    d = {'STATE': ['ID', 'MT', 'CA', 'WA'], 'CUSTOMER': ['Jerry', 'Tom', 'Patrick', 'Lucy'], 
         'ORDERS': [10, 119, 87, 918], 'EMAIL OWNER': ['Jerry@example.com', 'Jerry@example.com', 
         'Jerry@example.com', 'Mark@example.com']}
    
    df = pd.DataFrame(data=d)
    
    grouped = df.groupby('EMAIL OWNER')
    for emails, data in grouped:
        print(emails)
        SMTP_Emailer(data.loc[:, :].to_html(), emails)
    

    ¡Espero que esto ayude!

Comments are closed.