【问题标题】:Python pandas when sorting table, choose ascending/decending based on value of a column?Python pandas在对表格进行排序时,根据列的值选择升序/降序?
【发布时间】:2020-01-23 16:06:28
【问题描述】:

我有一个包含这些列的 df:时间、用户名、通道 ID、座位 ID。

我想按以下方式对表格进行排序:

1st:时间,升序,

2nd:用户名升序,

3rd: aisle_id 升序,

第4位:seat_id,aisle_id为奇数时升序,aisle_id为偶数时降序。

我尝试将 df 分为 df_odd 和 df_even,使用 df.sort_values 根据第 4 条规则对两者进行排序,然后使用 concat,然后按第 1、第 2 和第 3 条规则排序。然而,这违反了第四条规则。

是否有这样做的功能,还是我一开始尝试了正确的方法?

【问题讨论】:

    标签: python pandas function numpy sorting


    【解决方案1】:

    您可以按时间、用户名和 aisle_id 分组,然后根据 aisle_id 的值在每个组内按座位 ID 对值进行排序。

    要在组内排序,请创建函数 func():

    def func(x):
        if (x["aisle_id"].iloc[0]%2 == 0):
            ans = x["seat_id"].sort_values(ascending=False)
        else:
            ans = x["seat_id"].sort_values()
        return ans
    

    然后 groupby 并应用 func():

    ans = 
    df.groupby(["time","username","aisle_id"]).apply(func).reset_index(level=[0,1,2])
    

    由于 groupby 自动按升序对组进行排序,因此无需按时间、用户名和通道进行排序。

    例如,对于以下数据框

    df = pd.DataFrame(columns = ["time","username","aisle_id","seat_id"])
    df.loc[:,"time"] = [0, 0, 0, 0, 1, 1, 1, 1]
    df.loc[:,"username"] = [0, 0, 1, 1, 2, 2, 3, 3]
    df.loc[:,"aisle_id"] = [1, 1, 3, 3, 2, 2, 2, 2]
    df.loc[:,"seat_id"] = [0, 1, 3, 1, 1, 2, 3, 4]
    print(df)
    
       time username aisle_id  seat_id
    0    0     0        1       0
    1    0     0        1       1
    2    0     1        3       3
    3    0     1        3       1
    4    1     2        2       1
    5    1     2        2       2
    6    1     3        2       3
    7    1     3        2       4
    

    输出答案是

        time username aisle_id  seat_id
    0    0      0       1        0
    1    0      0       1        1
    3    0      1       3        1
    2    0      1       3        3
    5    1      2       2        2
    4    1      2       2        1
    7    1      3       2        4
    6    1      3       2        3
    

    【讨论】:

    • 谢谢,这是一个聪明的答案!
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2016-10-18
    • 2015-07-30
    • 1970-01-01
    • 2018-05-21
    • 2013-08-15
    • 2022-11-26
    相关资源
    最近更新 更多