Как использовать слияние Python или объединение двух панд данных с помощью строки - PullRequest
0 голосов
/ 08 мая 2018

Я хочу объединить данные двух данных. Фрейм данных - строка

df1=pd.read_csv('test1.csv',encoding='utf8',index_col=['id_df1'],header=0)
df2=pd.read_csv('test2.csv',encoding='utf8',index_col=['id_df2'],header=0)
print(df1)
print(df2)

out:
id_df1  student  contact_person
1       john     Amy
2       jeff     Cindy
3       steven   Bob
4       tina     Amy


id_df2  student  parents_list
1       tina     (Amy) (Bob)
2       steven   (Eric) (Bob)
3       john     (Amy)
4       jeff     (Frank) (Harry)

print(type(df1['contact_person'][0]))
print(type(df2['parents_list'][0]))

out:
<class 'str'>
<class 'str'>

если df1 ['ученик'] == df2 ['ученик'] и df1 ['contact_person'] соответствуют df2 ['parent_list']
Я хочу использовать «внешний» метод, подобный этому:

output

    id_df1 id_df2 student contact_person parents
0   1      3      john    Amy            (Amy)
1   3      2      steven  Bob            (Eric) (Bob)
2   4      1      tina    Amy            (Amy) (Bob)
3   2      null   jeff    Cindy          null
4   null   4      jeff    null           (Frank) (Harry)

1 Ответ

0 голосов
/ 08 мая 2018

Один из способов будет следующим: сначала в вашем df1 вы создадите столбец bool, если ваше условие выполнено:

df1['bool'] = df1.apply(lambda row: True if row['contact_person'] in df2['parents_list'][df2['student'] == row['student']].iloc[0] else False,1)

Тогда вы можете merge тот, где условие выполненоdf_yes и append там, где оно не выполнено df_no:

df_yes = df1[df1['bool'] == True].\
         merge(df2, on='student', how = 'left').drop('bool',1)
df_no = df1[df1['bool'] == False].\
        append(df2[df2['student'].isin(df1['student'][df1['bool'] == False])]).drop('bool',1)

Наконец просто append оба:

list_ordered_col = ['id_df1', 'id_df2', 'student', 'contact_person', 'parents_list']
df_output = df_yes.append(df_no)[list_ordered_col ].\
            reset_index(drop=True)

Примечание: это работало с вашим предыдущим вводомдля parent_list (когда это были a, b, c ...)

РЕДАКТИРОВАТЬ: заменить df1['bool']=... на:

def parantes_in_parentList (row, df_list):
    df_parent_list = df_list['parents_list'][df_list['student'] == row['student']]
    if not df_parent_list.empty:
        if row['contact_person'] in df_parent_list.iloc[0]:
            return True
    # return False in all the other case
    return False
df1['bool'] = df1.apply(parantes_in_parentList , args=([df2]),axis=1)
...