Панды: использовать функцию карты, чтобы посмотреть значение в другой df - PullRequest
0 голосов
/ 16 ноября 2018

Я хотел бы использовать функцию карты для обновления значений в df1 на основе искомого значения в df2 Столбец поиска - ISIN_CUSIP_CODE

df1 = [('ISIN_CUSIP_CODE', ['US68323ABL70', '9128284D9', '912828W89', 'CA135087J470','CA135087J470','912796QP7','US20030NCM11','US912810SD19','XS1851277969',]),
                ('Product', ['GOVT', 'GOVT', 'GOVT', 'GOVT', 'GOVT', 'GOVT', '', '', '',]),        
                 ]    
        df1 = pd.DataFrame.from_items(df1)
        print(df1)
df2 = [('ISIN_CUSIP_CODE', ['US20030NCM11', 'US912810SD19', 'XS1851277969', 'XS1391086987', 'CA064151BL66', 'CA13595ZZ661', ]),
                ('Product_MRD', ['CORP', 'GOVT', 'CORP', 'CORP','CORP','CORP',]),
                 ]    
        df2 = pd.DataFrame.from_items(df2)
        print(df2)

df1
  ISIN_CUSIP_CODE Product
0    US68323ABL70    GOVT
1       9128284D9    GOVT
2       912828W89    GOVT
3    CA135087J470    GOVT
4    CA135087J470    GOVT
5       912796QP7    GOVT
6    US20030NCM11        
7    US912810SD19        
8    XS1851277969        
 df2
  ISIN_CUSIP_CODE Product_MRD
0    US20030NCM11        CORP
1    US912810SD19        GOVT
2    XS1851277969        CORP
3    XS1391086987        CORP
4    CA064151BL66        CORP
5    CA13595ZZ661        CORP

Моя функция карты не возвращает искомые значения в df2

df1['Product'].map(df2.set_index('ISIN_CUSIP_CODE')['Product_MRD'])
print(df1)

  ISIN_CUSIP_CODE Product
0    US68323ABL70    GOVT
1       9128284D9    GOVT
2       912828W89    GOVT
3    CA135087J470    GOVT
4    CA135087J470    GOVT
5       912796QP7    GOVT
6    US20030NCM11        
7    US912810SD19        
8    XS1851277969   

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Чистый раствор панд:

pd.concat([df1,df2.rename(columns = {'Product_MRD':'Product'})]).drop_duplicates(['ISIN_CUSIP_CODE'],keep='last').sort_values('ISIN_CUSIP_CODE')

Дополнительные библиотеки не требуются

0 голосов
/ 16 ноября 2018

Это простое решение с использованием частичного.

from functools import partial
def lookup(row, lookup_df):
    try:
        return lookup_df[lookup_df.ISIN_CUSIP_CODE == row['ISIN_CUSIP_CODE']].Product_MRD.values[0]
    except:
        return row['Product']
df1['ProductLooked'] = df1.apply(partial(lookup, lookup_df=df2), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...