检查列值是否在范围内

时间:2019-01-19 20:15:43

标签: python pandas dataframe

这就是我在数据框中的内容-

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

注意 :所有列的dtypeobject

现在,在我的最终数据框中,我只想包含纬度和经度落在特定范围内的行(例如24 < Latitude < 3079 < Longitude < 87)。

我的想法是为applyLatitude列中的所有值提供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 :(得分:3)

如果您不想修改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)]

答案 1 :(得分:2)

关于熊猫为何抛出该特定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()操作修改数据框列的 view 。这样做将确保最终以您期望的方式修改数据框。我在上面使用.loc编写的代码将告诉Pandas在内存中就地访问和修改该列的内容,这将使Pandas不会发出看到的警告。