【问题标题】:python pandas merge with any one valuepython pandas与任何一个值合并
【发布时间】:2015-09-12 03:11:06
【问题描述】:

我有两个类似的数据集

region  codes
A   GXM|GMR|MDK
B   APN|MGK|MMD
C   PPR|PXP|RGM
D   ALO|OMR|OGK
E   ATK|TLO|AOR
F   MKM|FXP|OZP
G   AMM|BZA|TEL

code    pcode
AOL 1001
GMR 1002
PPR 1003
OGK 1004
FXP 1005
BZA 1006

我正在寻找的输出是

region  codes   code    pcode
A   GXM|GMR|MDK GMR 1002
C   PPR|PXP|RGM PPR 1003
D   ALO|OMR|OGK OGK 1004
F   MKM|FXP|OZP FXP 1005
G   AMM|BZA|TEL BZA 1006

第一个数据集中的代码与第二个数据集中的代码匹配。任何一个代码都应该与第二个匹配。

【问题讨论】:

  • 到目前为止您为达到所需结果所做的具体尝试。
  • 我找不到任何选项来执行此模糊匹配,我看到合并与完全匹配有效??
  • 抱歉,我不清楚您的第一个 df 有 1/2/3 列的位置
  • 第一个 df 有 2 列。第 2 列包含一个带有 '|' 的连接字符串.
  • 显示您尝试解决问题的方法。

标签: python pandas


【解决方案1】:

这有点乱,首先将分隔符上的'codes'列和applymap拆分为每个元素,并将索引设置为'code'的另一个df传递,这将执行查找,我们将其简化为仅匹配的代码。

然后我们从中生成一个中间 df,我们将拆分重新应用到原始 df 以添加“pcode”列,这然后允许我们merge

In [246]:
matching_codes = df['codes'].str.split('|', expand=True).apply(lambda x: x.map(df1.set_index('code')['pcode'])).dropna(axis=0,thresh=1).sum(axis=1)
matching_codes

Out[246]:
0    1002
2    1003
3    1004
5    1005
6    1006
dtype: float64

In [249]:
matching_df = df1[df1['pcode'].isin(matching_codes)]
matching_df

Out[249]:
  code  pcode
1  GMR   1002
2  PPR   1003
3  OGK   1004
4  FXP   1005
5  BZA   1006

In [254]:
df['pcode'] = df['codes'].str.split('|', expand=True).apply(lambda x: x.map(matching_df.set_index('code')['pcode'])).sum(axis=1)
df.merge(matching_df, on='pcode')

Out[254]:
  region        codes  pcode code
0      A  GXM|GMR|MDK   1002  GMR
1      C  PPR|PXP|RGM   1003  PPR
2      D  ALO|OMR|OGK   1004  OGK
3      F  MKM|FXP|OZP   1005  FXP
4      G  AMM|BZA|TEL   1006  BZA

【讨论】:

  • 非常感谢 EdChum .. 我正在使用 pyzo 发行版 python 3.2.5 expand= True,它说 TypeError: split() got an unexpected keyword argument 'expand' 。我会检查最新的
猜你喜欢
  • 2022-11-04
  • 2020-10-11
  • 2023-02-22
  • 2014-07-19
  • 2016-01-10
  • 2017-10-11
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多