【问题标题】:Pandas sort DataFrame based on multiple conditionsPandas 根据多个条件对 DataFrame 进行排序
【发布时间】:2020-10-27 00:19:32
【问题描述】:

我有一个格式如下所示的数据框:

Id    Name    Mag    Out      Des

23    Yah     1.0    base     n-0
23    Yah     1.0    base     n-0
23    Yah     1.0    base     n-0
24    Nah     0.99   base     n-0
24    Nah     1.01   line-2   line-2
24    Nah     0.95   line-3   line-3
24    Nah     1.1    line-4   line-4
25    lol     1.0    line-1   line-1
25    lol     1.1    line-3   line-3
25    lol     0.9    line-4   line-4
25    lol     0.95   line-5   line-5

输出必须满足以下条件:

  1. 对于相同的 ID 和名称,如果“out”列只有基数,则只报告与第一行对应的项目一次。
  2. 对于相同的 ID 和名称,如果“out”列至少有一个基础项,则报告与基础对应的行以及“Mag”列的最小值和最大值。

输出必须采用以下格式:

Id    Name    Mag    Out      Des

23    Yah     1.0    base     n-0
24    Nah     0.99   base     n-0
24    Nah     0.95   line-3   line-3
24    Nah     1.1    line-4   line-4
25    lol     0.9    line-4   line-4
25    lol     0.95   line-5   line-5
25    lol     1.0    line-1   line-1
25    lol     1.1    line-3   line-3

【问题讨论】:

标签: python pandas pandas-groupby


【解决方案1】:

这是一种方法。为了清楚起见,分几个步骤:

def check_base(x):
    if all([elem == "base" for elem in x]):
        return ["keep"] + ["drop"] * (len(x)-1)
    elif "base" in list(x):
        return ["keep" if i=="base" else "maybe" for i in list(x)]
    else:
        return "keep"

df["criteria"] = df.groupby(["Id", "Name"], as_index = False).Out.transform(check_base)

g_min = df.groupby(["Id", "Name"]).Mag.transform("min")
g_max = df.groupby(["Id", "Name"]).Mag.transform("max")

df = df[(df.criteria == "keep") | (df.criteria == "maybe") & ((df.Mag == g_min) | (df.Mag == g_max))]

结果是:

    Id Name   Mag     Out     Des criteria
0   23  Yah  1.00    base     n-0     keep
3   24  Nah  0.99    base     n-0     keep
5   24  Nah  0.95  line-3  line-3    maybe
6   24  Nah  1.10  line-4  line-4    maybe
7   25  lol  1.00  line-1  line-1     keep
8   25  lol  1.10  line-3  line-3     keep
9   25  lol  0.90  line-4  line-4     keep
10  25  lol  0.95  line-5  line-5     keep

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2023-02-01
    • 2022-01-13
    • 2021-03-21
    • 2017-09-14
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多