#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». как я могу изменить приведенный выше код, чтобы справиться с этим?