这就是我在数据框中的内容-
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
由于我是熊猫的新手,所以我很难理解这一点。最好的方法是什么?
答案 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不会发出看到的警告。