L oop для перебора двух списков не работает - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь использовать al oop для перебора двух списков. К сожалению, второй для l oop не работает: он проверяет только первый элемент в списке, но не с остальными. Не могли бы вы сказать мне, почему?

Спасибо

Списки:

low_cars_engines=['Audi', 'Bentley', 'Bugatti', 'Porsche', 'Skoda']
low_planes_engines=['Pratt & Whitney','Rolls-Royce','GE Aviation']

Я хотел бы добавить еще два столбца (Автомобили и самолеты) к моему исходному набору данных на основе операторы if:

  • если объект из списка 'Engine to check' находится в списке low_cars_engines, то это автомобиль, в противном случае его нет;
  • если объект из список 'Engine to check' находится в списке low_planes_engines, тогда это плоскость, в противном случае это не так.
import re

df['Cars'] = pd.Series(index = df.index, dtype='object')
df['Planes'] = pd.Series(index = df.index, dtype='object')

for index, row in df.iterrows():
    value = row['Engine to check']
    for x in low_cars_engines:
        if x in value:
            print(x)
            df.at[index,'Cars'] = 'Yes' # need to keep df.at[index, '_']
            break
        else: 
            df.at[index,'Cars'] = 'No' # need to keep df.at[index, '_']
            break

for index, row in df.iterrows():
    value = row['Engine to check']
    for x in low_planes_engines:
        if x in value:
            df.at[index,'Planes'] = 'Yes'
            break
        else: 
            df[index,'Planes'] = 'No'
            break

print(df)

Первый для l oop работает нормально, но не второй: я не могу присвоить значение элементу в списке «Механизм для проверки», даже если он в списке low_planes_engines (это дает мне всегда Нет).

Не могли бы вы сказать мне, что не так, и если можно было бы использовать только один для l oop вместо двух? Я бы предпочел сохранить ту же структуру или оставить df.at[index,'_']. Прямо сейчас второй l oop печатает / проверяет только первый элемент списка low_planes_engines (т.е. Pratt & Whitney) и не go до конца.

Поскольку набор данных похож на:

Audi
CFM International
Rolls-Royce
Bentley
Volkswagen
Toyota
Suzuki
Porsche

и не включает этот элемент, все строки в Planes установлены в No.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Вы не должны использовать циклы при работе с Pandas. DataFrames не предназначены для последовательного доступа. Вам нужно немного NumPy, однако:

import numpy as np
df['Cars']   = np.where(df['Engine to check'].isin(low_cars_engines), 'Yes', 'No') 
df['Planes'] = np.where(df['Engine to check'].isin(low_planes_engines), 'Yes', 'No')

Результат:

#     Engine to check Cars Planes
# 0               Audi  Yes     No
# 1  CFM International   No     No
# 2        Rolls-Royce   No    Yes
# 3            Bentley  Yes     No
# 4         Volkswagen   No     No
# 5             Toyota   No     No
# 6             Suzuki   No     No
# 7            Porsche  Yes     No

Вы, вероятно, также не должны использовать "Да" и "Нет". Вместо этого используйте логические значения True и False, так как с ними будет проще работать в будущем:

df['Cars']   = df['Engine to check'].isin(low_cars_engines) 
df['Planes'] = df['Engine to check'].isin(low_planes_engines)

Наконец, если все в DataFrame строго автомобиль или самолет, только один столбец необходимо. Другой будет дополнением.

1 голос
/ 07 апреля 2020

У вас есть дополнительный пробел здесь

row['Engine to check ']

Попробуйте изменить его на

row['Engine to check']
...