使用“if loop”时序列的真值不明确

2024-09-26 22:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个长度不等的数据帧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循环中使用相同的条件时,它就不起作用了。在

^{pr2}$

有人能解释一下为什么它不起作用吗?我怎样才能让“如果循环”在这里工作呢?我已经看过这个答案,但我不知道我需要改变什么。 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

Tags: 数据in元素dfforindexnanhead
2条回答

这里有一个可读的答案。我刚刚添加了一些数据,让事情变得更明显。对于生成的布尔数组,您可以根据需要应用any或{}函数。在

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]]

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_gr中的这一行足够接近。整个系列不能只是对或错-这就是错误所说的。在

我不太清楚你到底想达到什么目的,所以我只能解释一下这个错误。在

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

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)

相关问题 更多 >

    热门问题