Как сопоставить и объединить два фрейма данных, имеющие совершенно разные значения, кроме чисел в столбцах фрейма? - PullRequest
0 голосов
/ 27 февраля 2019

имеют 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, чтобы тип в ABC обновлялся с типом в xyzиспользуя значения (цифры) в цене 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 также не совпадает с некоторыми другими, где он должен совпадать с едой

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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
0 голосов
/ 27 февраля 2019

Вы можете сделать следующее:

'''
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.

...