如何匹配和合并两个具有完全不同值的数据框,数据框列中的数字除外?

Posted

技术标签:

【中文标题】如何匹配和合并两个具有完全不同值的数据框,数据框列中的数字除外?【英文标题】:How to match and merge two dataframes having completely different values except numericals in columns of dataframe? 【发布时间】:2019-07-21 00:25:44 【问题描述】:

有一个值的数据框 ABC

      id         |     price                          |   type
0     easdca     | Rs.1,599.00 was trasn by you       | unknown
1     vbbngy     | txn of INR 191.00 using            | unknown
2     awerfa     | Rs.190.78 credits was used by you  | unknown
3     zxcmo5     | DLR.2000 credits was used by you   | unknown

和其他 XYZ 值

         price          |   type
0      190.78           | food
1      191.00           | movie
2      2,000            | football
3      1,599.00         | basketball

如何将 XYZ 与 ABC 映射,以便使用 XYZ 价格中的值(数字)将 ABC 中的类型更新为 xyz 中的类型。

我需要的输出

       id         |     price                          |   type
0     easdca     | Rs.1,599.00 was trasn by you        | basketball
1     vbbngy     | txn of INR 191.00 using             | movie
2     awerfa     | Rs.190.78 credits was used by you   | food
3     zxcmo5     | DLR.2,000 credits was used by you| football

用过这个

d = dict(zip(XYZ['PRICE'],XYZ['TYPE']))

pat = (r'()'.format('|'.join(d.keys())))

ABC['TYPE']=ABC['PRICE'].str.extract(pat,expand=False).map(d)

但是像 190.78 和 191.00 这样的值会变得不匹配。 例如,在处理大量数据时,190.78 应该与食物值匹配,例如 190.77 与分配有其他值的食物不匹配。并且 198.78 也与其他一些应该与食物匹配的不匹配

【问题讨论】:

超级好,你能用这个数据添加解决方案吗? 所以它会引发错误? 190.78 应该与食物匹配,而使用像 190.77 这样巨大的数据值会与分配了其他值的食物不匹配 【参考方案1】:

df

        id                price                                type
0       easdca        Rs.1,599.00 was trasn by you          unknown
1       vbbngy        txn of INR 191.00 using               unknown
2       awerfa        Rs.190.78 credits was used by you     unknown
3       zxcmo5        DLR.2000 credits was used by you      unknown

df2

           price                   type
0        190.78                    food
1        191.00                   movie
2        2,000                 football
3        1,599.00            basketball

使用re

df['price_'] = df['price'].apply(lambda x: re.findall(r'(?<=[\.\s])[\d\.]+',x.replace(',',''))[0])
df2.columns = ['price_','type']
df2['price_'] = df2['price_'].str.repalce(',','')

将类型更改为浮动

df2['price_']  = df2['price_'].astype(float)
df['price_']  = df['price_'] .astype(float)

使用pd.merge

df = df.merge(df2, on='price_')
df.drop('type_x', axis=1)

输出

                id                                 price   price_       type_y
0      easdca        Rs.1,599.00 was trasn by you         1599.00   basketball
1      vbbngy        txn of INR 191.00 using               191.00        movie
2      awerfa        Rs.190.78 credits was used by you     190.78         food
3      zxcmo5        DLR.2000 credits was used by you        2000     football

【讨论】:

工作但仅获得两个输出而不是全部。不知道为什么 嗯奇怪它对我有用.. 我建议检查价格列 问题是。在 df 的 price 列中,我们的 price_ 值为 1599.00,但在 df2 中,我们有相同的值与 1599 匹配,因此内部合并不起作用,因为 .00 它适用于 2120.23 但不是 1599 的值 你为什么不把价格转换成浮点数..然后合并 当我创建 df 时,价格列的类型是 str,现在我将它们转换为浮动.. 看看这是否有帮助【参考方案2】:

您可以执行以下操作:

'''
First we make a artificial key column to be able to merge
We basically just substract the floating numbers from the string
And convert it to type float
'''

df1['price_key'] = df1['price'].str.replace(',', '').str.extract('(\d+\.\d+)').astype(float)

# After that we do a merge on price and price_key and drop the columns which we dont need
df_final = pd.merge(df1, df2, left_on='price_key', right_on='price', suffixes=['', '_2'])
df_final = df_final.drop(['type', 'price_key', 'price_2'], axis='columns')

输出

    id      price                               type_2
0   easdca  Rs.1,599.00 was trasn by you        basketball
1   vbbngy  txn of INR 191.00 using             movie
2   awerfa  Rs.190.78 credits was used by you   food
3   zxcmo5  DLR.2000.78 credits was used by you football

我假设你在xyz 表中打错了,第三个价格应该是2000.78 而不是2000

【讨论】:

ValueError: 您正在尝试合并 float64 和对象列。如果你想继续,你应该使用 pd.concat 阅读错误,它从字面上说明了问题所在..您已将两个数据框的列转换为浮动:df['Column'] = df.Column.astype(float).price_key 列已经浮动,因此您必须更改你的xyz 表的price 列也要浮动。 ValueError: 无法将字符串转换为浮点数: 替换字符串中的逗号:df['Column'] = df['Column'].str.replace(',', '').astype(float) 伟大的举动使price_key成为一个浮点数并将其用于合并,+1。不过,我不会依赖浮点数的精度作为非常 floaty 值的合并键。

以上是关于如何匹配和合并两个具有完全不同值的数据框,数据框列中的数字除外?的主要内容,如果未能解决你的问题,请参考以下文章

查找两个不同数据框列之间的部分匹配,并在找到匹配时分配值

具有两个不同名称的数据框列

Pyspark/SQL 将具有列表值的列连接到另一个数据框列

根据给定的系列创建具有 0 和 1 值的新数据框列 [重复]

是否有一个 R 函数来匹配基于具有部分相似性的字符串的数据框列?

当列数事先未知时如何访问 Pandas 数据框列