我有my_dataframe
:
data | lat | lon |
------------+-----------------+--
10 | 1.0 | 3.0
11 | 2.0 | 4.0
21 | 9.0 | 3.0
我也有accepted_coordinates = [(1.0, 3.0), (2.0, 4.0)]
的列表。
我需要从纬度不在accepted_coordinates
中的数据框中删除所有行,因此最终答案应该是看起来像这样的数据框:
data | lat | lon |
------------+-----------------+--
10 | 1.0 | 3.0
11 | 2.0 | 4.0
我用groupby
和isin
尝试了一些方法,但是不知道如何做到这一点。
注意:如果两个坐标都在accepted_coordinates
中,但顺序错误,则应删除该行。也就是说,如果有一行(1.0, 4.0)
答案 0 :(得分:2)
我会将accepted_coordinates
转换为数据框:
acc_coor = pd.DataFrame(accepted_coordinates, columns=['lat', 'lon'])
和merge
与my_dataframe
:
res = my_dataframe.merge(acc_coor, on=['lat', 'lon'], how='inner')
res
data lat lon
0 10 1.0 3.0
1 11 2.0 4.0
答案 1 :(得分:1)
此解决方案符合您帖子中的编辑内容。
import pandas as pd
df = pd.DataFrame(data=[(10, 1.0, 3.0), (11, 2.0, 4.0), (21, 9.0, 3.0)], columns=['data', 'lat', 'lon'])
valid_lat, valid_lon = zip(*[(1.0, 3.0), (2.0, 4.0)])
valid_lat = set(valid_lat)
valid_lon = set(valid_lon)
df = df[df['lat'].isin(valid_lat) & df['lon'].isin(valid_lon)]
答案 2 :(得分:0)
这可以通过以下方式实现:
def get_lat_lon(row):
# For creating new column
return (row['lat'], row['lon'])
df = pd.DataFrame(columns=['data', 'lat', 'lon'])
df['data'] = [10, 12, 15, 20]
df['lat'] = [1.0, 2.0, 9.0, 12.0]
df['lon'] = [3.0, 4.0, 3.0, 2.0]
accepted_coordinates = [(1.0, 3.0), (12.0, 2.0)]
df['lat_lon'] = df.apply(get_lat_lon, axis=1)
modified_df = df[df['lat_lon'].isin(accepted_coordinates)].drop(columns=['lat_lon'])