у меня есть две таблицы
df1 = pd.DataFrame([{'a': 1}, {'a': 2}, {'a': 8}])
df1['b'] = ""
df2 = pd.DataFrame([{'e': [1,2,3], 'f': 1},{'e': [4,5,6], 'f': 2},{'e': [7,8,9], 'f': 3}])
e f
Я хотел бы вставить значение в df1['b'] из df2['f'] при условии, что значение в df['a'] находится где-то в df2['e']
В основном я бы использовал apply/map
df1['a'].apply(lambda x: function)
Я могу получить конкретное значение, которое мне нужно
df2['f'].loc[df2['e'].apply(lambda y: value_to_look_for in y)].item()
но когда я собрал это вместе
df1['a'].apply(lambda x: (df2['f'].loc[df2['e'].map(lambda y:x in y)].item()))
Я получаю сообщение об ошибке «ValueError: можно преобразовать только массив размером 1 в скаляр Python»
Могу ли я попросить решение, что мне не хватает?
IIUC, вы можете создать маску, используя apply
, а затем использовать ее для замены значений на loc
:
m = df2["e"].apply(lambda x: df1["a"].isin(x).any())
df1.loc[m, "b"] = df2["f"]
a b
0 1 1
1 2
2 8 3
Я бы взорвал , создал серию сопоставлений и сопоставил:
df1['b'] = df1['a'].map(df2.explode('e').set_index('e')['f'])
Выход:
a b
0 1 1
1 2 1
2 8 3
Промежуточная серия картографии:
df2.explode('e').set_index('e')['f']
e
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
Name: f, dtype: int64
это работает, как и ожидалось, спасибо
каков ваш ожидаемый результат?