Частичное совпадение строк python как Vlookup - PullRequest
1 голос
/ 29 января 2020

У меня есть следующие фреймы данных:

    df1 = pd.DataFrame({'Invoice': ['3 HongKong', 'A Africa', 'A GhanaLimited', 'AfricaGroup'],
                        'Currency': ['EUR', 'EUR', 'EUR', 'USD']})

    df2 = pd.DataFrame({'Ref': ['3 Hong', 'A Africa', 'A Ghana', 'Africa Group'],
                        'Type': ['01', '03', '04', '02'],
                        'Amount': ['Live', 'No', 'Live', 'No'],
                        'Comment': ['bla', 'bla', 'bla', 'bla']})

    print(df1)
    print(df2)

              Invoice Currency
    0      3 HongKong      EUR
    1        A Africa      EUR
    2  A GhanaLimited      EUR
    3     AfricaGroup      USD
                Ref Type Amount Comment
    0        3 Hong   01   Live     bla
    1      A Africa   03     No     bla
    2       A Ghana   04   Live     bla
    3  Africa Group   02     No     bla

Я хотел бы создать новый фрейм данных (df3), где я объединяю эти два на основе счета. Проблема заключается в том, что номера счетов-фактур не всегда являются «полным соответствием», а иногда «частичным соответствием» в df2 ['Ref']. Таким образом, присоединение к «Счета-фактуре» не дает желаемого результата, поскольку оно не копирует данные для счетов-фактур.

Я попробовал следующий код:

    df4 = df1.copy()

    def get_amount(x):
       return df2.loc[df2['Ref'].str.contains(x), 'Amount'].iloc[0]

    df4['Amount'] = df4['Invoice'].apply(get_amount)

Но это дает мне ошибку :

IndexError: один позиционный индексатор вышел за пределы

Можно ли решить эту проблему?

...