首页 > 解决方案 > 带有循环数据框的 Python 列表理解

问题描述

我正在寻找一些我无法找到答案的非常具体的东西。

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

只要数据帧 A 的 ID 使用列表理解存在于数据帧 B 中,我就想将纬度和经度存储在一个列表中。我可以让第一部分正常工作,但匹配 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 存在于另一个数据框中(关闭),就可以从提取中存储“纬度”和“经度”。但是,这会导致没有数据被检索。谁能指导我哪里出错了?如果我排除最后一个“if”语句,它工作正常。那么我应该怎么做这个 if 语句呢?

谢谢!

标签: pythonpandasdataframelist-comprehension

解决方案


我认为列表理解不是必需的,更好更快的是通过过滤使用矢量化解决方案boolean indexingisin然后转换为列表:

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检查索引值,而不是值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']]

推荐阅读