使用'if loop'时,Series的真值是不明确的

问题描述 投票:0回答:2

我有2个不等长df和df_IGR的数据帧,它们都有Lat和Lon列,我想比较一下。

当我进行元素比较时,我能够从两个df中的任何一个中提取任何列值,其中两个df之间的Lat和Lon之差小于0.005

for row in df_IGR.itertuples():
    print(df.index[((df.Lat - row.Lat) < 0.005) & ((df.Lon - row.Lon) < 0.005)])

这工作,但当我尝试在if循环中使用相同的条件时,它不起作用。

for row in df_IGR.itertuples():
    count = 0
    if (((df.Lat - row.Lat) < 0.0005) & ((df.Lon - row.Lon) < 0.0005)):
        print (row.Name)
        count = count + 1
print (count)
>>ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

任何人都可以解释为什么它不起作用?如何让“if循环”在这里工作?我已经完成了这个答案,但我不明白我需要改变什么。 https://stackoverflow.com/a/36922103/7763326

编辑:数据看起来像

df.head()
>>
                 back_hr    Lat      Lon        AGL   Pressure
BT_time                 
1998-01-01 11:15:00  0.0    75.197  -150.045    1000.0  900.8
1998-01-01 11:00:00 -0.2    75.245  -150.001    1002.4  900.5
1998-01-01 10:00:00 -1.2    75.447  -149.863    1011.2  899.2
1998-01-01 09:00:00 -2.2    75.661  -149.785    1019.3  898.3
1998-01-01 08:00:00 -3.2    75.887  -149.762    1028.1  897.1

df_IGR.head()
>>
    ID          Lat     Lon   Elevation State   Name    FirstYr LastYr  NObs
193 BEM0000644  50.796  4.358   99       NaN    UCCLE   1949    2016    42564
195 BEM0000647  50.033  5.400   558      NaN    ST-HUBE 1964    2006    26357
241 BOM0002685  53.933  27.633  231      NaN    MINSK   1939    1998    43822
242 BOM0003300  52.116  23.683  144      NaN    BREST   1951    2007    40167
244 BOM0003304  52.401  30.963  126      NaN    GOMEL   1970    2017    32410
python pandas
2个回答
1
投票

df.Lat是一个系列赛。

df.Lat - row.Lat也是如此。

(df.Lat - row.Lat) < 0.0005也是如此。

((df.Lat - row.Lat) < 0.0005) & ((df.Lon - row.Lon) < 0.0005)也是如此。

最后一个系列是一个布尔系列,它告诉你df中哪些点与df_IGR中的这一行足够接近。整个系列不仅仅是真或假 - 这就是错误所说的。

我不太确定你到底想要实现什么,所以我只能解释错误。

但是,如果您尝试计算足够接近的点对数,则可以执行嵌套循环:

count = 0
for row_IRG in df_IGR.itertuples():
    for row in df.itertuples():
        if (((row_IRG.Lat - row.Lat) < 0.0005) & ((row_IRG.Lon - row.Lon) < 0.0005)):
        print (row.Name, row_IRG.Name)
        count = count + 1
print (count)

0
投票

这是一个可读的单行答案。我刚刚添加了一些数据,以便更明显地发生了什么。使用生成的布尔数组,您可以根据需要应用anyall函数。

Lat1 = [3, 1, 4, 6, 1, 4, 9]  # df_IGR.Lat.values
Lat2 = [6, 7, 4, 1, 3]        # df.Lat.values

Lon1 = [5, 4, 5, 6, 8, 3, 9]  # df_IGR.Lon.values
Lon2 = [4, 2, 1, 6, 5]        # df.Lon.values

comparison = [[(i - j < 3) & (k - l < 3) for i, k in zip(Lat1, Lon1)] \
                                         for j, l in zip(Lat2, Lon2)]

# [[True, True, True, True, False, True, False],
#  [False, True, False, False, False, True, False],
#  [False, False, False, False, False, True, False],
#  [True, True, False, False, True, False, False],
#  [True, True, True, False, False, True, False]]
© www.soinside.com 2019 - 2024. All rights reserved.