Добавьте новый столбец в фрейм данных на основе информации из другого фрейма данных

#python #python-3.x #pandas #dataframe

Вопрос:

Эй, у меня их два DataFrames : data1 со столбцами KEY , value1 , value2 , и data2 со столбцом KEY (но мы можем предположить, что столбцов гораздо больше). Теперь я хочу создать value столбец data1 in таким образом , чтобы , если данный key параметр находится в KEY столбце in data2 , то value он равен value2 , а в противном случае он равен value1 . Вот мой код:

 import pandas as pd d1 = {"KEY": ["KEY1", "KEY2", "KEY3"], "value1": ["ABC",[] , []], "value2": ["abc", "XYZ",[] ]} data1 = pd.DataFrame(d1)  d2 = {"KEY": ["KEY2"]} data2 = pd.DataFrame(d2)  data1["value"] = data1.apply(lambda x: x["value2"] if x["KEY"] in list(data2["KEY"]) else x["value1"], axis = 1)  

Это работает правильно, но я хотел бы знать, является ли это наиболее эффективным методом или я могу сделать это лучше.

Ответ №1:

Я думаю, что этот код будет более эффективным, потому что нет необходимости просматривать каждую строку по очереди с помощью apply.

Вот код:

 import pandas as pd d1 = {"KEY": ["KEY1", "KEY2", "KEY3"], "value1": ["ABC",[] , []], "value2": ["abc", "XYZ",[] ]} data1 = pd.DataFrame(d1)  d2 = {"KEY": ["KEY2"]} data2 = pd.DataFrame(d2)  index_1 = data1.set_index("KEY").index index_2 = data2.set_index("KEY").index intersection = index_1.isin(index_2)  data1.loc[intersection, "value"] = data1.loc[intersection, "value2"] data1.loc[~intersection, "value"] = data1.loc[~intersection, "value1"]  

И выход:

введите описание изображения здесь