当前位置: 首页 > 知识库问答 >
问题:

Python,基于几个条件过滤数据帧

穆正青
2023-03-14

我有以下数据框:

我想根据以下条件对其进行过滤:

创建的角度=范围(87-92)

GDT 1和GDT 2之间的距离

到目前为止我尝试了这个(最后一个方法):

class DataFrameToGeneratedList:

    def __init__(self, lat_lon_list=None, lat_list=None, lon_list=None):
        if lon_list is None:
            lon_list = []
        if lat_list is None:
            lat_list = []
        if lat_lon_list is None:
            lat_lon_list = []
        self.lat_lon_list = lat_lon_list
        self.lat_list = lat_list
        self.lon_list = lon_list

    # Some unrelated methods here...


    def create_points_df(self):
        # Convert points list to xy coordinates.
        xy_lat_lon_list = [convert_to_xy(l_xy) for l_xy in self.lat_lon_list]
        # Midpoint between gdt1 and every point in xy.
        midpoints_xy = [get_midpoint(gdt1_xy, point) for point in xy_lat_lon_list]
        # Converted midpoints from xy to GeoPoints.
        midpoints = [convert_to_lat_lon(xy_point) for xy_point in midpoints_xy]
        # Distance from gdt 1 to every point.
        distances = [get_distances(gdt1, geo_point) for geo_point in self.lat_lon_list]
        # List of angles for every point in lat_lon_list.
        angled_list = [angle_between_points(arrayed_gdt1, arrayed_uav, point) for point in xy_lat_lon_list]
        # Get distance from uav to every midpoint created.
        midpoints_to_uav = [get_distances(uav, midpoint) for midpoint in midpoints]

        data_dict = {
            'Latitude': self.lat_list,
            'Longitude': self.lon_list,
            'Angle Created': angled_list,
            'Point In XY': xy_lat_lon_list,
            'MidPoint of GDT 1 and GDT 2': midpoints_xy,
            'Distance between GDT 1 and GDT 2': distances,
            'Distance between UAV and MidPoint': midpoints_to_uav
        }
        unfilterd_df = pd.DataFrame(data_dict)
        print(unfilterd_df)
        return unfilterd_df

    def filter_df_results(self, finished_df):
        assert isinstance(finished_df, pd.DataFrame)
        finished_df = finished_df
        finished_df = (finished_df[(finished_df['Angle Created'] >= 88) & (finished_df['Angle Created'] <= 95) &
                                   (finished_df['Distance between GDT 1 and GDT 2']) >= (
                                               2 * finished_df['Distance between UAV and MidPoint'])])
        print(finished_df)


if __name__ == '__main__':
    a = DataFrameToGeneratedList()
    a.generate_points_list(a.generate_pd())
    df = a.create_points_df()
    a.filter_df_results(finished_df=df)

此代码的输出是一个没有错误的空数据库。

Empty DataFrame
Columns: [Latitude, Longitude, Angle Created, Point In XY, MidPoint of GDT 1 and GDT 2, Distance between GDT 1 and GDT 2, Distance between UAV and MidPoint]
Index: []

共有1个答案

公瑞
2023-03-14

语法应该看起来像:

finished_df = (
    finished_df[
            (finished_df['Angle Created'] >= 88) &
            (finished_df['Angle Created'] <= 95) & 
            (finished_df['Distance between GDT 1 and GDT 2'] >= (2 * finished_df['Distance between UAV and MidPoint']))]
    )

每个条件都用括号括起来。

可以考虑为单独的条件创建掩码以简化筛选器语句。

 类似资料:
  • 如果我有一个清单,比如说 我如何才能获得一个名字不同的年龄最大的学生名单?在C#中,使用system.linq GroupBy然后比较,然后用select进行扁平化,这将非常简单,我不太确定如何在Java中实现同样的功能。

  • 使用Spark SQL,我有两个数据帧,它们是从一个数据帧创建的,例如: 我想过滤df1,如果它的“路径”的一部分是df2中的任何路径。所以如果df1有路径为“a/b/c/d/e”的行,我会找出df2中是否有路径为“a/b/c”的行。SQL应该是这样 其中udf是用户定义的函数,用于缩短df1的原始路径。简单的解决方案是使用JOIN,然后过滤结果,但这很慢,因为df1和df2都有超过10mil的行

  • 基于“SC”代码,我需要将SRCTable与RefTable-1或RefTable-2连接起来 条件:如果SC为“D”,则SRCTable在KEY=KEY1上与RefTable-1连接以获得值。否则,如果SC为“U”,则SRCTable与键=键2上的RefTable-2连接 这是输入spark数据帧。 预期产出: 注意:输入表将有数百万条记录,因此需要一个优化的解决方案

  • 我有一个数据集,包含以下各列: 现在,我需要添加一个新的column类,并根据以下条件将其赋值为或: 我只在一个条件下完成了它,但我不知道如何在多个条件下完成它。 这里的wIat我已经尝试过: 我查看了所有其他类似的问题,但找不到解决问题的任何方法。我尝试了上述所有帖子,但仍坚持这个错误:

  • 问题内容: 我试图根据多个条件对列表进行排序。 现在,如果我有一个清单,说 我怎样才能得到一个名字不同的最老的学生名单?在C#中,使用System.Linq GroupB进行比较非常简单,然后将其与select进行比较,然后进行展平,我不太确定如何在Java中实现相同的目标。 问题答案: 使用收集器: 说明 我们正在使用以下重载: 上面的函数用于提取映射键的值。 上面的函数用于提取地图值的值,其中

  • 问题内容: 我正在尝试使用Pandas在几个条件下进行布尔索引。我原来的DataFrame称为。如果执行以下操作,将得到预期的结果: 但是,如果我这样做(我认为应该是等效的),则不会返回任何行: 知道导致差异的原因是什么? 问题答案: 使用是因为运算符优先级: 或者,在单独的行上创建条件: 样品 :