我正在寻找一些非常具体的东西,而我却找不到答案。
我有两个数据框。包含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语句呢?
谢谢!
答案 0 :(得分:2)
我认为列表理解不是必需的,更好和更快的方法是通过boolean indexing
和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']]
您的解决方案失败了,因为 in 在熊猫check index values中,而不是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 :(得分: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']})