在DataFrame中使用循环的Python列表推导式

4

我正在寻找一个非常具体的东西,但是我找不到答案。

我有两个数据框。一个包含ID、纬度和经度。另一个只有ID。

我想使用列表推导式,在Dataframe B中存在Dataframe A的ID时将纬度和经度存储在列表中。我可以很好地完成第一部分,但似乎匹配ID会出现问题。这是我目前的进展:

heat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() if row['NBN Location Id'] in closed['SP Order Location ID']]

根据我的理解,这段代码是从提取中存储“纬度”和“经度”,只要ID在其他数据框(closed)中存在。然而,这会导致没有数据被检索出来。有人能指导我错在哪里吗?如果我排除最后一个“if”语句,它就可以正常工作。那么我应该如何编写这个if语句呢?

谢谢!

2个回答

3

我认为列表推导式并不是必要的,更好和更快的方法是使用向量化的解决方案,通过使用 布尔索引 进行过滤,并使用 isin,然后将其转换为列表:

mask = extract['NBN Location Id'].isin(closed['SP Order Location ID'])
cheat_data = extract.loc[mask, ['latitude', 'longitude']].values.tolist()

样例:

closed = pd.DataFrame({'SP Order Location ID':list('ace')})
print (closed)
  SP Order Location ID
0                    a
1                    c
2                    e

extract = pd.DataFrame({'NBN Location Id':list('abcde'),
                       'latitude':['lat1','lat2','lat3','lat4','lat4'],
                       'longitude':['long1','long2','long3','long4','long4']})

print (extract)
  NBN Location Id latitude longitude
0               a     lat1     long1
1               b     lat2     long2
2               c     lat3     long3
3               d     lat4     long4
4               e     lat4     long4

mask = extract['NBN Location Id'].isin(closed['SP Order Location ID'])
cheat_data = extract.loc[mask, ['latitude', 'longitude']].values.tolist()
print (cheat_data)
[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

你的解决方案失败了,因为pandas中的in检查索引值,而不是Series的值,所以需要将其转换为列表:
cheat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() 
              if row['NBN Location Id'] in closed['SP Order Location ID'].tolist()]
print (cheat_data)
[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

#changed index values
closed = pd.DataFrame({'SP Order Location ID':list('ace')}, index=list('dbw'))
print (closed)
  SP Order Location ID
d                    a
b                    c
w                    e

cheat_data = [[row['latitude'],row['longitude']] for index, row in extract.iterrows() 
              if row['NBN Location Id'] in closed['SP Order Location ID']]
print (cheat_data)

[['lat2', 'long2'], ['lat4', 'long4']]

1
使用 @jezrael 的数据
ids = {*closed['SP Order Location ID']}
cols = ['latitude', 'longitude', 'NBN Location Id']
[p for *p, i in zip(*map(extract.get, cols)) if i in ids]

[['lat1', 'long1'], ['lat3', 'long3'], ['lat4', 'long4']]

closed = pd.DataFrame({'SP Order Location ID':list('ace')})

extract = pd.DataFrame({'NBN Location Id':list('abcde'),
                       'latitude':['lat1','lat2','lat3','lat4','lat4'],
                       'longitude':['long1','long2','long3','long4','long4']})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接