Python 合并两个csv文件(如果匹配列),然后连接额外的列

Python 合并两个csv文件(如果匹配列),然后连接额外的列,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,我正在寻找熊猫方面的帮助。我试图比较“email”列是否匹配,然后将额外的列连接到单独的csv中 我有以下资料: file1.csv email, user_id example1@gmail.com, 1 example2@gmail.com, 24 example3@gmail.com, 12 example5@gmail.com, 31 文件2.csv email, group_id example1@gmail.com, g1 example2@gmail.com, g1 exampl

我正在寻找熊猫方面的帮助。我试图比较“email”列是否匹配,然后将额外的列连接到单独的csv中

我有以下资料:

file1.csv

email, user_id
example1@gmail.com, 1
example2@gmail.com, 24
example3@gmail.com, 12
example5@gmail.com, 31
文件2.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

我感谢您提供的任何帮助。谢谢。

是的,这就像进行合并一样简单:

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

将“how”设置为“internal”可确保仅保留两个文件中的匹配项

是的,这与进行合并一样简单:

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

将“how”设置为“internal”可确保仅保留两个文件中的匹配项

据我所知,您试图实现以下目标:

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)
这就产生了一个输出:

                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
                email  user_id group_id
0  example1@gmail.com        1       g1
1  example2@gmail.com       24       g1
2  example3@gmail.com       12       g2
我希望这就是你要找的。所有匹配的数据都将保留,所有缺失的数据都将使用NaN进行更改。如果只希望保留完全匹配的数据,只需将此行中的“外部”替换为“内部”:

result = result.merge(dataframe, how = "inner")
它给出了一个输出:

                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
                email  user_id group_id
0  example1@gmail.com        1       g1
1  example2@gmail.com       24       g1
2  example3@gmail.com       12       g2

据我所知,你当时正试图实现这样的目标:

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)
这就产生了一个输出:

                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
                email  user_id group_id
0  example1@gmail.com        1       g1
1  example2@gmail.com       24       g1
2  example3@gmail.com       12       g2
我希望这就是你要找的。所有匹配的数据都将保留,所有缺失的数据都将使用NaN进行更改。如果只希望保留完全匹配的数据,只需将此行中的“外部”替换为“内部”:

result = result.merge(dataframe, how = "inner")
它给出了一个输出:

                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
                email  user_id group_id
0  example1@gmail.com        1       g1
1  example2@gmail.com       24       g1
2  example3@gmail.com       12       g2
尝试合并

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)
输出是

email   user_id  group_id
0  example1@gmail.com         1        g1
1  example2@gmail.com        24        g1
2  example3@gmail.com        12        g2
尝试合并

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)
输出是

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

这是怎么写的,它将file1.csv和file2.csv的文件位置作为一个数据框?@JeremyLin如果你想在某个文件夹中自动搜索csv文件,你可以这样做:path_to_files=[“path/to/csv2”,“path/to/csv3”]等,然后列出_with_dataframes=[pd.read_csv(file)for path_to_files],这也是可能的。如果你需要的话,我可以更新答案来说明这一点。这怎么能写成它将file1.csv和file2.csv的文件位置作为一个数据帧呢?@JeremyLin你可以这样做:path\u to_files=[“path/to/csv2”,“path/to/csv3”]等等,然后列出带有数据帧的\u=[pd.read\u csv(文件)作为path\u to_文件中的文件]如果您想在某个文件夹中自动搜索csv文件,也可以这样做。如果你需要的话,我可以更新答案。