Создать логический столбец на основе условия - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть кадр данных из 11 столбцов, и я хочу создать новый столбец 0,1 на основе значений в двух из этих столбцов.

Я уже пытался использовать np.where для создания других столбцов, но он не работает для этого.

train["location"] = np.where(3750901.5068 <= train["x"] <= 3770901.5068 
and -19268905.6133 <= train['y'] <= -19208905.6133, 1, 0)

Я получаю эту ошибку: ValueError: Значение истинности Серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Я не уверен, что вам даже нужно np.where здесь. Чтобы поэлементно and две серии, используйте & здесь вместо and. См .: Логические операторы для логического индексирования в Pandas

Кроме того, 3750901.5068 <= train["x"] <= 3770901.5068 кажется внутренне переведенным python в (3750901.5068 <= train["x"]) and (train["x"] <= 3770901.5068), который, опять же, имеет and и не будет работать. Таким образом, вам нужно либо явно разделить каждый на, например, (3750901.5068 <= train["x"]) & (train["x"] <= 3770901.5068) или используйте Series.between например train["x"].between(3750901.5068, 3770901.5068, inclusive=True). См .: Как выбрать строки в DataFrame между двумя значениями в Python Pandas?

Вам также понадобятся круглые скобки для двух аргументов &.

Таким образом, конечный результат должен выглядеть следующим образом:

train["location"] = train["x"].between(3750901.5068, 3770901.5068, inclusive=True) & train['y'].between(-19268905.6133, -19208905.6133, inclusive=True)

Это даст вам серию bools (Истины и Ложи). Это уже только 0 и 1 под капотом. Если вы действительно хотите 0 и 1, вы можете выбрать решение из здесь . Например, train.location = train.location.astype(int)

0 голосов
/ 04 апреля 2019

Вы можете использовать pandas.DataFrame.isin, который будет лучшим решением. Также да, вам нужна скобка и & вместо "и". Документация для панд. DataFrame.isin https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.isin.html

Например:

df=pd.DataFrame({'a':[100,110,120,111,109],'b':[120,345,124,119,127]})
df['c']=np.where((df['a'].isin([100,111])) & (df['b'].isin([120,128])),1,0)

В вашем случае это будет:

train["location"]=np.where(((train["x"].isin([3750901.5068,3770901.5069])) & (train["y"].isin([-19268905.6133,-19268905.6132])),1,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...