Я новичок в Python и очень надеюсь, что вы поможете мне с моей проблемой.
Я предоставил два кадра данных:
d1 (несколько списков)
d1 = pd.DataFrame({
'city': ['New York', 'Chicago', 'Los Angeles','Washington, D.C.', 'San Francisco',
'New York City', 'Francisco', 'Washington', 'Dallas', 'Miami', 'Boston'],
'value':[ 10 , 5 , 7 , 8 , 9 , 10 , 9 , 8 , 10 , 4 , 3 ]})
d2 ("master" - DataFrame .. элементы, перечисленные только один раз)
d2 = pd.DataFrame({
'city': ['New York City', 'Los Angeles','Washington', 'San Francisco', 'Dallas'],
'value':[ 10 , 7 , 8 , 9 , 10 ]})
Что я хочу сделать сейчас:
- Взять каждый список из d1
- Поиск, если 'd1.value' существует в d2
- Для каждого результата:
- сравнить названия городов (не 1: 1, но как "содержит"), поэтому:если d1.city в d2.city ИЛИ d2.city в d1.city
- При сопоставлении: установите флаг в новом столбце "MatchWithD2" в d1
У меня уже есть решение для него с apply, но это занимает так много времени (для больших версий d1 и d2):
def add_flag(x):
dfRet= d2.apply(lambda y: y['city']
if ((x['value'] == y['value']
and x['city'] in y['city'] or y['city'] in x['city']))
else None, axis=1)
dfRet= dfRet.dropna(axis=0,how='all')
if dfRet.empty:
dfRet=np.nan
else:
dfRet= dfRet.to_string(index=False)
return dfRet
d1['MatchWithD2'] = d1.apply(add_flag, axis =1)
Не могли бы вы помочь мне с этой проблемой?
Большое спасибо !!
С наилучшими пожеланиями!