Сценарий логического индексатора работает без ошибок, но не работает - PullRequest
0 голосов
/ 14 июля 2020

Первый код работает, второй блок кода не выдает ошибок, но не дает ожидаемого результата.

Первый код создает новый столбец ['Тип']. Названия одинаковых магазинов, но с разными названиями, заносятся в столбец ['Тип']. Итак: название магазина A и название магазина B находятся в столбце [Naam]. Скрипт помечает оба значения как «Супермаркет» в столбце [«Тип»]. Пока все хорошо.

Второй блок кода должен пометить каждый магазин / магазин и т. Д. c. который не указан в словаре Namendict.test. Хочу эти непризнанные магазины и т.д. c. обозначен как ['Diversen']. Надеюсь, у кого-то есть предложение. Спасибо!

1: рабочий код:

from Namendict import test

for value in df['Naam']:
     for i, (k,v) in enumerate(test.items()):          
        boolean_indexer = df['Naam'].str.contains(k)
        df.loc[boolean_indexer, 'Type'] = (v) 

2: должен работать код (без ошибок, но и без Diversen в столбце ['Type'], только NaN):

from Namendict import test

for value in df['Naam']:
     for i, (k,v) in enumerate(test.items()):          
        boolean_indexer = df['Naam'].str.contains(k)
        if True:
            df.loc[boolean_indexer, 'Type'] = (v)
        else:
            df.loc[boolean_indexer, 'Type'] = ('Diversen.') 

Большое спасибо. Яннеман

1 Ответ

1 голос
/ 14 июля 2020

Есть несколько вариантов решения этой проблемы. Первый вариант - просто заменить впоследствии значения «NaN» на «Diverse» с функцией fillna от pandas. Это выглядит следующим образом:

from Namendict import test

# Looping over all existing records in the dict
for k,v in test.items():          
   boolean_indexer = df['Naam'].str.contains(k)
   df.loc[boolean_indexer, 'Type'] = v

# Filling in all empty ("nan") values with "Diversen."
df['Type'] = df['Type'].fillna("Diversen.")

Другой вариант - проверить, существует ли имя в «тестовом» словаре. Если да, то «тип», хранящийся в словаре, можно поместить в DataFrame. Вместо этого выполняется цикл по всем уникальным именам в столбце по всем значениям. Это гарантирует, что вы не выполните одно и то же действие несколько раз.

from Namendict import test

for naam in df['Naam'].unique(): # Loop over all unique names in DataFrame
    boolean_indexer = df['Naam'].str.contains(naam)

if naam in test.keys(): # Check if the name allready excist in dict
    # If True --> get type from the dictionary     
    df.loc[boolean_indexer, 'Type'] = test[naam] 
else:
    # If False --> fill in 'Diversen.' 
    df.loc[boolean_indexer, 'Type'] = "Diversen."  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...