Проверьте, находятся ли значения столбца в пределах диапазона - PullRequest
0 голосов
/ 19 января 2019

Вот что у меня есть в моем фрейме данных:

RecordType    Latitude    Longitude    Name
  L             28.2N        70W       Jon
  L             34.3N        56W       Dan
  L             54.2N        72W       Rachel

Примечание : dtype всех столбцов равно object.

Теперь, в моем последнем кадре данных, я хочу включить только те строки, в которых широта и долгота находятся в определенном диапазоне (скажем, 24 < Latitude < 30 и 79 < Longitude < 87).

Моя идея состоит в том, чтобы apply функция для всех значений в столбцах Latitude и Longitude, чтобы сначала получить float значения, такие как 28.2 и т. Д., А затем сравнить значения, чтобы увидеть, попадают ли они в мой диапазон.Поэтому я написал следующее:

def numbers(value):
    return float(value[:-1])

result[u'Latitude'] = result[u'Latitude'].apply(numbers)
result[u'Longitude'] = result[u'Longitude'].apply(numbers)

Но я получаю следующее предупреждение:

Warning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Мне трудно понять это, так как я новичок в Пандах.Какой лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Что касается того, почему Панды выдавали это конкретное предупреждение A value is trying to be set on a copy of a slice... и как его избежать:

Во-первых, использование этого синтаксиса должно предотвратить появление сообщения об ошибке:

result.loc[:,'Latitude'] = result['Latitude'].apply(numbers)

Pandas предупредил вас, потому что ваша функция .apply() может пытаться изменить временную копию из Latitude / Longitude столбцов в вашем фрейме данных.Это означает, что столбец копируется в новое место в памяти перед выполнением операции с ним.В статье, на которую вы ссылались (http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy), приведены примеры того, почему это может потенциально вызвать непредвиденные проблемы в определенных ситуациях.

Вместо этого Pandas рекомендует вместо этого использовать синтаксис, который обеспечит изменение вида столбца вашего фрейма данных с помощью операции .apply(). Это обеспечит изменение вашего фрейма данных в соответствии с вашими ожиданиями. Код, который я написал выше с использованием .loc, сообщит Pandas о доступе и изменении содержимогоэтот столбец помещается в память, и это не даст Пандам выдать предупреждение, которое вы видели.

0 голосов
/ 19 января 2019

Если вы не хотите изменять df, я бы предложил избавиться от apply и векторизовать это. Один вариант использует eval.

u = df.assign(Latitude=df['Latitude'].str[:-1].astype(float))
u['Longitude'] = df['Longitude'].str[:-1].astype(float)

df[u.eval("24 < Latitude < 30 and 79 < Longitude < 87")]

У вас есть больше вариантов, используя Series.between:

u = df['Latitude'].str[:-1].astype(float))
v = df['Longitude'].str[:-1].astype(float))

df[u.between(24, 30, inclusive=False) & v.between(79, 87, inclusive=False)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...