对于循环错误,SettingWithCopyWarning:尝试在DataFrame的切片副本上设置一个值

时间:2018-10-25 09:47:10

标签: python for-loop nested-loops

我试图用GPS坐标计算100米半径内的点。我的数据有4列,如下所示;

Index     Longitude    Latitude      Count
1         35.897654    26.568987       0
2         32.98717     23.897740       0
3         36.23245     34.243246       0
.          ....         ....          ....
.          ....         ....          ....

我用Haversine方法计算了到坐标的距离。我将其描述为功能。

haversine([x1,y1],[x2,y2])给出GPS坐标之间的距离。

我的问题出现在以下代码中;

for x in range(0,25486):
    for y in range(1,25486):
        a = haversine([cr.iloc[x][0],cr.iloc[x][1]],[cr.iloc[y][0],cr.iloc[y][1]])
        if a <= 100 and a > 0:
            cr.iloc[x][2]=cr.iloc[x][2]+1

它会引发此错误;

主要:5:SettingWithCopyWarning:正在尝试从DataFrame的切片副本上设置一个值

请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

我检查了文档,但找不到有用的东西或不理解。

我做错了什么? 进行此嵌套循环操作的正确方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

cr.iloc[x][2]=cr.iloc[x][2]+1

此代码未在数据框中设置值

我已更改为;

for x in range(0,25486):
    t=0
    for y in range(0,25486):
        a = haversine([cr.iloc[x][1],cr.iloc[x][2]],[cr.iloc[y][1],cr.iloc[y][2]])
        if a <= 400 and a > 0:
            t = t+1   
    cr.set_value(x,'Adet',t)

答案 1 :(得分:0)

通过查看您的问题,我没有得到答案,但我对使用 .set_value 的研究使我得到了非常相似的结果。

我正在使用 .at[index, 'column'] = value

我的代码:

for index, row in customersOnMap.iterrows():
x = row.loc['customer_zip_code_prefix']
if x in list_zip_code.geolocation_zip_code_prefix.values:
    lat = list_zip_code[list_zip_code.geolocation_zip_code_prefix == x].geolocation_lat.values[0]
    long = list_zip_code[list_zip_code.geolocation_zip_code_prefix == x].geolocation_lng.values[0]
    customersOnMap.at[index, 'geolocation_lat'] = lat
    customersOnMap.at[index, 'geolocation_lng'] = long
else:
    print('Couldn t find the zip code', x, 'in the list.')

链接到更多信息:

https://www.dataindependent.com/pandas/pandas-set-values/