Je cherche de l'aide avec des pandas. J'essaie de comparer la colonne "e-mail" pour toute correspondance, puis de concaténer les colonnes supplémentaires dans un fichier csv séparé.

J'ai ce qui suit:

File1.csv

email, user_id
example1@gmail.com, 1
example2@gmail.com, 24
example3@gmail.com, 12
example5@gmail.com, 31

File2.csv

email, group_id
example1@gmail.com, g1
example2@gmail.com, g1
example3@gmail.com, g2
example4@gmail.com, g3

Output.csv:

email, user_id, group_id
example1@gmail.com, 1, g1
example2@gmail.com, 24, g1
example3@gmail.com, 12, g2

J'apprécie toute aide fournie. Merci.

1
Jeremy Lin 7 avril 2020 à 21:53

3 réponses

Meilleure réponse

Essayez de fusionner

import pandas as pd 
f1 = pd.read_csv('f1.csv')
f2 = pd.read_csv('f2.csv')
out = pd.merge(f1,f2,on='email',how='inner')
print(out)
out.to_csv("final.csv", index=False)

La sortie est

email   user_id  group_id
0  example1@gmail.com         1        g1
1  example2@gmail.com        24        g1
2  example3@gmail.com        12        g2
2
programing_is_hard 7 avril 2020 à 19:07

Oui, c'est aussi simple que de faire une fusion:

output = pd.merge(left=file1, right=file2, on='email', how='inner')

Définir le «comment» sur «intérieur» garantit que seules les correspondances dans les deux fichiers sont conservées

0
LiamFiddler 7 avril 2020 à 19:04

D'après ce que j'ai compris, vous tentiez de réaliser quelque chose comme ça:

import pandas as pd

csv1 = pd.DataFrame({"email":["example1@gmail.com", "example2@gmail.com", "example3@gmail.com", "example5@gmail.com"],"user_id":[1,24,12,31]})
csv2 = pd.DataFrame({"email":["example1@gmail.com", "example2@gmail.com", "example3@gmail.com", "example4@gmail.com"],"group_id":["g1","g1","g2","g3"]})
csv3 = pd.DataFrame({"email":["example1@gmail.com", "example2@gmail.com", "example3@gmail.com"],"user_id":[1,24,12],"group_id":["g1","g1","g2"]})

list_with_dataframes = [csv2,csv3]

result = csv1
for dataframe in list_with_dataframes:
    result = result.merge(dataframe, how = "outer")

print(result)

Et cela donne une sortie:

                email  user_id group_id
0  example1@gmail.com      1.0       g1
1  example2@gmail.com     24.0       g1
2  example3@gmail.com     12.0       g2
3  example5@gmail.com     31.0      NaN
4  example4@gmail.com      NaN       g3

J'espère que c'est ce que vous recherchez. Toutes les données correspondantes sont conservées, toutes les données manquantes sont modifiées avec NaN. Si vous voulez que seules les données entièrement correspondantes soient conservées, remplacez simplement "externe" par "interne" dans cette ligne:

result = result.merge(dataframe, how = "inner")

Cela donne une sortie:

                email  user_id group_id
0  example1@gmail.com        1       g1
1  example2@gmail.com       24       g1
2  example3@gmail.com       12       g2
1
Karl Olufsen 7 avril 2020 à 19:11