Как объединить фреймы данных, только если один столбец соответствует определенному условию

#python #pandas #dataframe

Вопрос:

Допустим, у меня есть фрейм данных «df_main»:

 ID   Type
1    Car
1    Truck
2    Truck
 

И еще один фрейм данных «truck_data»:

 Truck_ID         Data
1          TruckData1
2          TruckData2
 

Объединение этих двух дает фрейм данных:

    ID   Type  Truck_ID        Data
0   1    Car         1  TruckData1
1   1  Truck         1  TruckData1
2   2  Truck         2  TruckData2
 

Как я могу изменить инструкцию merge, чтобы она объединяла только строки из truck_data, соответствующие идентификатору, если и только если тип = = «Грузовик»?

Желаемый результат:

    ID   Type  Truck_ID        Data
0   1    Car         1  
1   1  Truck         1  TruckData1
2   2  Truck         2  TruckData2
 

Текущий код:

 df_main = pd.DataFrame(columns=['ID', 'Type'], data=[[1, 'Car'], [1, 'Truck'], [2, 'Truck']])
truck_df = pd.DataFrame(columns=['Truck_ID', 'Data'], data=[[1, 'TruckData1'], [2, 'TruckData2']])
df_main = df_main.merge(truck_df, left_on='ID', right_on='Truck_ID', how='left')
 

Ответ №1:

Filter the required rows из df1 / perform merge / concat нефильтрованные строки.

 m = df_main.Type.eq('Truck')
merged_df = pd.concat([df_main.loc[~m], df_main.loc[m].merge(truck_df, left_on='ID', right_on='Truck_ID')]
 

выход:

    ID   Type        Data
0   1    Car         NaN
0   1  Truck  TruckData1
1   2  Truck  TruckData2
 

Комментарии:

1. спасибо, я немного отредактировал его, чтобы соответствовать фактическим требованиям вопроса: merged_df = pd.concat([df_main.loc[~m], df_main.loc[m].merge(truck_df, left_on=’ID’, right_on=’Truck_ID’)])

Ответ №2:

Я бы сделал это вот так:

 df_main.merge(truck_df.assign(Type='Truck'), on=['ID', 'Type'], how='left')
 

Выход:

    ID   Type        Data
0   1    Car         NaN
1   1  Truck  TruckData1
2   2  Truck  TruckData2
 

Подробные сведения:

assign временный столбец в truck_df с именем » Тип «и объедините как «Идентификатор», так и » Тип » с how='left'

Комментарии:

1. извините, я забыл отредактировать свой вопрос. поле идентификатора truck_data на самом деле называется «Truck_ID». как я могу изменить приведенный выше код, чтобы справиться с этим?