如果坐标对不在列表中,则从数据框中删除

时间:2019-11-08 04:21:33

标签: python pandas dataframe

我有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

我用groupbyisin尝试了一些方法,但是不知道如何做到这一点。

注意:如果两个坐标都在accepted_coordinates中,但顺序错误,则应删除该行。也就是说,如果有一行(1.0, 4.0)

3 个答案:

答案 0 :(得分:2)

我会将accepted_coordinates转换为数据框:

acc_coor = pd.DataFrame(accepted_coordinates, columns=['lat', 'lon'])

mergemy_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'])