Python 在使用';如果循环';

Python 在使用';如果循环';,python,pandas,Python,Pandas,我有两个长度不等的数据帧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)]) 这是一个易读的单行答案。我刚刚添加了一些数据,以便

我有两个长度不等的数据帧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)])

这是一个易读的单行答案。我刚刚添加了一些数据,以便更清楚地了解正在发生的事情。通过生成的布尔数组,您可以根据需要应用
任何
所有
函数

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]]
Lat1=[3,1,4,6,1,4,9]#df#u 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
比较=[(i-j<3)和(k-l<3)对于i,k-in-zip(Lat1,Lon1)]\
对于zip中的j,l(Lat2,Lon2)]
#[[真,真,真,真,假,真,假],
#[假,真,假,假,假,真,假],
#[假,假,假,假,假,真,假],
#[真,真,假,假,真,假,假],
#[真,真,真,假,假,真,假]]

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)
count=0
对于df_IGR.itertuples()中的行IRG:
对于df.itertuples()中的行:
如果(((排IRG.Lat-排Lat)<0.0005)和((排IRG.Lon-排Lon)<0.0005)):
打印(row.Name,row_IRG.Name)
计数=计数+1
打印(计数)

您需要将
count=0
移出循环,
&
在python中也是按位的,您需要
。最后,什么是
df.Lat
您不需要在
df
以及
df_IGR
的每一行上循环?您能提供一些数据吗?@Nick添加了数据以供澄清。我想从df_IGR中获取一个Lat和Lon值,并检查条件。在满足要求的情况下,我想打印该Lat的df_IGR.Name,并Lon@Cleb为数据编辑我最初是用zip接近它的,但它破坏了我的系统,因为它压缩了2个巨大的df。这是我问的问题,您知道可以将pd.Series直接输入到zip中,以避免创建大型列表,例如
zip(df_IGR.Lat,df_IGR.Lon)
。这样您就不会创建新的列表/对象
pd.Series
是可编辑的,就像列表一样。是的,当条件满足时,我想从df_IGR获取row_IGR.Name和其他一些列值。但是,您的方法出现了一个语义错误,我无法理解(假设print语句在IF循环中)。如果我打印(row_IRG.Name,row_IRG.Lat,row_IRG.Lon,row.Lat,row.Lon)编辑:输出的第一行是:UCCLE 50.796 4.358 78.793 179.807显然它给出了两个df中的Lat Lon值不匹配的输出。这个错误是因为我应该使用类似于模运算符的条件。谢谢
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]]
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)