合并不同长度的 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

感谢大家的帮助!