#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"]
И выход: