У меня есть список, который состоит из разных цветов, все хранятся в виде строковых переменных.

Preferredcolours = ['red','yellow','green', 'blue']

У меня есть массив панд, который содержит информацию об автомобилях. Один из столбцов DfCar ['color'] состоит из цветов этих автомобилей. Я хочу создать новую переменную в моем фрейме данных, столбец с именем PreferredMathcing, который = 1, если цветовой столбец DataFrame совпадает с одним из цветов списка. Как я могу использовать цикл для решения этой проблемы?

Я бы идеально хотел такого рода решение:

+=================+============================+
| DfCar['colour'] | DfCar['PreferredMathcing'] |
+=================+============================+
| white           |                          0 |
+-----------------+----------------------------+
| yellow          |                          1 |
+-----------------+----------------------------+
| black           |                          0 |
+-----------------+----------------------------+
| purple          |                          0 |
+-----------------+----------------------------+
| green           |                          1 |
+-----------------+----------------------------+
1
Saif Ul haq 24 Июн 2019 в 15:38

4 ответа

Лучший ответ

Вы можете использовать .isin () , который возвращает Серию с True / False для каждой строки, основываясь на том, находится ли она в списке значений. затем используйте .astype(int), чтобы получить вместо него 1 / 0.

Попробуй это:

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({'colour': ['white', 'yellow', 'black', 'purple', 'green']})
Preferredcolours = ['red','yellow','green', 'blue']

df["PreferredMathcing"] = df['colour'].isin(Preferredcolours).astype(int)

print(df)

Выход:

   colour  PreferredMathcing
0   white                  0
1  yellow                  1
2   black                  0
3  purple                  0
4   green                  1

< Сильный > Примечание :

Выбор решения с чисто библиотечной функцией, скорее всего, превзойдет решение, используя apply с пользовательской логикой python.

Сравнительный анализ тех, кто противостоит друг другу на моей машине, показывает, что .isin() почти в 8 раз быстрее:

with '.isin()': 1.0591506958007812
with '.apply()': 8.234664678573608
ratio: 7.774780974248154

1
Adam.Er8 24 Июн 2019 в 13:08

Следующее даст вам вывод

def check_colour(x, Preferredcolours) :
    return 1 if x['colour'] in Preferredcolours else 0

dfCar['PreferredMathcing'] = df.apply(check_colour,args=(Preferredcolours,), axis=1)
1
Suresh 24 Июн 2019 в 12:48

Предполагая, что DfCar - ваш Dataframe.

Preferredcolours = ['red','yellow','green', 'blue']    
DfCar['PreferredMatching'] = DfCar['colour'].apply(lambda x: x in Preferredcolours)

Это будет применять лямбда-функцию ко всем элементам в вашем «цветном» столбце. Просто проверьте, находится ли он в «предпочитаемых цветах», и верните значение «Истина» или «Ложь».

0
dustin-we 24 Июн 2019 в 12:49

Вы можете использовать np.where, как показано ниже:

import pandas as pd
import numpy as np

DfCar = pd.DataFrame.from_dict({'colour': ['white', 'yellow', 'black', 'purple', 'green']})
Preferredcolours = ['red','yellow','green', 'blue']

DfCar['PreferredMathcing'] = np.where(DfCar['colour'].isin(Preferredcolours), 1, 0)
0
Wytamma Wirth 24 Июн 2019 в 12:52