合并不同长度的 dfs 并保留来自 "master" df 的所有值
Merge different length dfs and preserve all values from "master" df
进行我认为应该是简单合并的工作,但我找不到完全正确的解决方案。
我有两家世界500强公司的df。 df1 是 2 列(公司和 CIK),117 行长。 df2 有 2 列(等级和公司)和 225 行长。 dfs公司订单不一样
我想要一个与公司名称匹配的数据框(即使公司名称的拼写不是 100% 相同),保留 df2 的顺序,并填写从 df1 到 df2 的 CIK 值,并填写Na 在剩余值中(108 将是 NA)。
此合并仅给出 52 个值(可能是完全匹配的值)。
df3 = df2.merge(df1, on="Company")
这个合并填充了很多不完全匹配的 NaN 值:
df3 = df2.merge(df1, on="Company", how = "outer")
df1:
{'Company': {0: 'Amazon',
1: 'Verizon Communications',
2: 'AT&T',
3: 'Alphabet',
4: 'Intel',
5: 'Facebook',
6: 'Exxon Mobil',
7: 'Microsoft',
8: 'Duke Energy',
9: 'Comcast',
10: 'Exelon'},
'CIK': {0: '0001018724',
1: '0000732712',
2: '0001018724',
3: '0001652044',
4: '0000050863',
5: '0001326801',
6: '0000034088',
7: '0000789019',
8: '0001326160',
9: '0001166691',
10: '0001109357'}}
df2:
{'Rank': {0: 1,
1: 2,
2: 3,
3: 4,
4: 5,
5: 6,
6: 7,
7: 8,
8: 9,
9: 10,
10: 11},
'Company': {0: 'Walmart',
1: 'Amazon',
2: 'Apple',
3: 'CVS Health',
4: 'United Health Group',
5: 'Berkshire Hathaway',
6: 'McKesson',
7: 'AmerisourceBergen',
8: 'Alphabet',
9: 'Exxon Mobil',
10: 'AT&T'}}
我也尝试过各种 .concat 和 .join 但遇到了类似的问题。
循环会更合适吗?
谢谢!
更新:使用左连接,CIK 行用 NaN 填充(附图片)。另外,应该提到 CIK 列是 dtype=str 因为 dtype=int64 消除了前导零,我需要 API 调用的零。
您想做的是 LEFT JOIN。
考虑到附加的图像,我制作了自己的示例数据。
您可以参考此代码并了解其工作原理。
如果您的结果中所有 CIK 值都是 NaN,这可能是因为 'Company' 值由于某些原因在 df1 和 df2 之间没有正确匹配,例如值中的空格。
import pandas as pd
df1 = pd.DataFrame({
'Company': ['Amazon', 'Intel', 'Alphabet', 'Tech Data'],
'CIK': ['0001018724', '000050863', '0001652044', '0000790703'],
})
df2 = pd.DataFrame({
'Rank': [1, 2, 3, 4, 5],
'Company': ['Walmart', 'Amazon', 'Apple', 'CVS Health', 'Tech Data'],
})
df3 = df2.merge(df1, on='Company', how='left')
print(df3)
# Rank Company CIK
#0 1 Walmart NaN
#1 2 Amazon 0001018724
#2 3 Apple NaN
#3 4 CVS Health NaN
#4 5 Tech Data 0000790703
JOIN有多种,如LEFT JOIN、RIGHT JOIN、OUTER JOIN、INNER JOIN等。
您可以在此处查看带有示例代码的各种 JOIN:
使用:
df2.to_dict()
我看到
中有多余的字符
df2['Company']
此代码块删除了附加字符“\xa0”:
df2['Company'] = df2["Company"].apply(lambda x: str(x).replace(u'\xa0', u''))
然后执行左连接:
df3 = df2.merge(df1, on="Company", how="left")
输出:
Rank Company CIK
0 1 Walmart 0000104169
1 2 Amazon 0001018724
2 3 Apple 0000320193
3 4 CVS Health 0000064803
4 5 United Health Group NaN
感谢大家的帮助!
进行我认为应该是简单合并的工作,但我找不到完全正确的解决方案。
我有两家世界500强公司的df。 df1 是 2 列(公司和 CIK),117 行长。 df2 有 2 列(等级和公司)和 225 行长。 dfs公司订单不一样
我想要一个与公司名称匹配的数据框(即使公司名称的拼写不是 100% 相同),保留 df2 的顺序,并填写从 df1 到 df2 的 CIK 值,并填写Na 在剩余值中(108 将是 NA)。
此合并仅给出 52 个值(可能是完全匹配的值)。
df3 = df2.merge(df1, on="Company")
这个合并填充了很多不完全匹配的 NaN 值:
df3 = df2.merge(df1, on="Company", how = "outer")
df1:
{'Company': {0: 'Amazon',
1: 'Verizon Communications',
2: 'AT&T',
3: 'Alphabet',
4: 'Intel',
5: 'Facebook',
6: 'Exxon Mobil',
7: 'Microsoft',
8: 'Duke Energy',
9: 'Comcast',
10: 'Exelon'},
'CIK': {0: '0001018724',
1: '0000732712',
2: '0001018724',
3: '0001652044',
4: '0000050863',
5: '0001326801',
6: '0000034088',
7: '0000789019',
8: '0001326160',
9: '0001166691',
10: '0001109357'}}
df2:
{'Rank': {0: 1,
1: 2,
2: 3,
3: 4,
4: 5,
5: 6,
6: 7,
7: 8,
8: 9,
9: 10,
10: 11},
'Company': {0: 'Walmart',
1: 'Amazon',
2: 'Apple',
3: 'CVS Health',
4: 'United Health Group',
5: 'Berkshire Hathaway',
6: 'McKesson',
7: 'AmerisourceBergen',
8: 'Alphabet',
9: 'Exxon Mobil',
10: 'AT&T'}}
我也尝试过各种 .concat 和 .join 但遇到了类似的问题。
循环会更合适吗?
谢谢!
更新:使用左连接,CIK 行用 NaN 填充(附图片)。另外,应该提到 CIK 列是 dtype=str 因为 dtype=int64 消除了前导零,我需要 API 调用的零。
您想做的是 LEFT JOIN。 考虑到附加的图像,我制作了自己的示例数据。
您可以参考此代码并了解其工作原理。 如果您的结果中所有 CIK 值都是 NaN,这可能是因为 'Company' 值由于某些原因在 df1 和 df2 之间没有正确匹配,例如值中的空格。
import pandas as pd
df1 = pd.DataFrame({
'Company': ['Amazon', 'Intel', 'Alphabet', 'Tech Data'],
'CIK': ['0001018724', '000050863', '0001652044', '0000790703'],
})
df2 = pd.DataFrame({
'Rank': [1, 2, 3, 4, 5],
'Company': ['Walmart', 'Amazon', 'Apple', 'CVS Health', 'Tech Data'],
})
df3 = df2.merge(df1, on='Company', how='left')
print(df3)
# Rank Company CIK
#0 1 Walmart NaN
#1 2 Amazon 0001018724
#2 3 Apple NaN
#3 4 CVS Health NaN
#4 5 Tech Data 0000790703
JOIN有多种,如LEFT JOIN、RIGHT JOIN、OUTER JOIN、INNER JOIN等。
您可以在此处查看带有示例代码的各种 JOIN:
使用:
df2.to_dict()
我看到
中有多余的字符df2['Company']
此代码块删除了附加字符“\xa0”:
df2['Company'] = df2["Company"].apply(lambda x: str(x).replace(u'\xa0', u''))
然后执行左连接:
df3 = df2.merge(df1, on="Company", how="left")
输出:
Rank Company CIK
0 1 Walmart 0000104169
1 2 Amazon 0001018724
2 3 Apple 0000320193
3 4 CVS Health 0000064803
4 5 United Health Group NaN
感谢大家的帮助!