Python: если строка столбца Address1, Address2, Address3, Address4 содержит «x», то напишите «x» в столбце Address4

Я новичок в python и не знаю, с чего начать работу с моим набором данных, у меня есть данные о продажах клиентов в электронной коммерции, и мне нужен один из столбцов, содержащий часть адреса округа. Округ в большинстве случаев уже указан в столбце Address4, но некоторые клиенты вместо этого указали свой округ в Address1, Address2 или Address3.

У меня есть массив из всех 32 округов, поэтому я думаю, что мне нужно проверить каждый столбец Address1, Address2, Address3, Address4, чтобы увидеть, содержат ли они один из округов в массиве, и если они найдены, запишите найденный округ в Address4. Надеюсь, это имеет смысл.

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

в этом случае мне нужно будет найти лонгфорд из Address3 и записать Co Longford, найти Donegal в Address4 и записать Donegal в адрес 4, и то же самое для всех строк,


person Peter Snee    schedule 11.01.2021    source источник
comment
Если вы можете быть немного яснее в своем вопросе и привести воспроизводимый пример и желаемый результат, я уверен, что вы получите ответ в кратчайшие сроки.   -  person sophocles    schedule 11.01.2021
comment
Мне нужно перебрать весь фрейм данных и проверить, существует ли строка из моего массива округов в каком-либо из столбцов Address1, Address2, Address3 и Address4, и если она существует, то напишите строку в Address4   -  person Peter Snee    schedule 11.01.2021
comment
Я буду дома через 20 минут и постараюсь дать ответ.   -  person sophocles    schedule 11.01.2021


Ответы (1)


Скажи, что это твой дф

df=pd.DataFrame({'Address1':[np.nan, 'jkl','pol','city1', np.nan],'Address2':['lop',np.nan,'pola',np.nan, np.nan],'Address3':[np.nan, np.nan,np.nan,'city13', np.nan],'Address4':[np.nan, np.nan,np.nan,np.nan,'shaka']})

    Address1 Address2 Address3 Address4
0      NaN      lop      NaN      NaN
1      jkl      NaN      NaN      NaN
2      pol     pola      NaN      NaN
3    city1      NaN   city13      NaN
4      NaN      NaN      NaN    shaka

и сказать, что это список ваших адресов

listofAdress=['lop','jkl','pola','city13']

Создайте временный столбец со списком городов в каждой строке, исключая столбец addresses4.

df['temp']=df.iloc[:,:3].values.tolist()

Преобразуйте карты temp и listofAdress в наборы и пересеките их, а затем сбросьте темп.

  df=df.assign(Address4=np.where(df.Address4.isna(),(df['temp'].map(set).apply(lambda x:x.intersection(set(listofAdress)))).map(list).str[0],df.Address4)).drop('temp',1)




      Address1 Address2 Address3 Address4
0      NaN      lop      NaN      lop
1      jkl      NaN      NaN      jkl
2      pol     pola      NaN     pola
3    city1      NaN   city13   city13
4      NaN      NaN      NaN    shaka
person wwnde    schedule 11.01.2021
comment
Обратите внимание на мои правки - person wwnde; 11.01.2021
comment
Спасибо, но я получаю сообщение об ошибке. ‹ipython-input-127-7188f6b87023›:1: SettingWithCopyWarning: попытка установить значение для копии фрагмента из DataFrame. Попробуйте вместо этого использовать .loc[row_indexer,col_indexer] = value См. предостережения в документации: pandas.pydata.org/pandas-docs/stable/user_guide/ customerAddress['temp'] = customerAddress.iloc[:,:3]. значения.tolist() - person Peter Snee; 12.01.2021
comment
Это работает для меня. Какая у тебя версия панд? В любом случае это не должно иметь значения. Если в списке есть все ваши города, замените df.iloc[:,:3].values.tolist() на df['temp']=df.values.tolist(). - person wwnde; 12.01.2021
comment
Эй, соз, это было предупреждение, а не ошибка, видимо, тоже обычная. это сработало для большинства из них, могу ли я проверить, содержит ли строка в адресах 1, 2, 3 и 4 город из моего списка в любом месте строки, например, если клиент указал Дублин 2 вместо Дублина? - person Peter Snee; 12.01.2021