Python pandas 对表进行排序时,根据列的值选择升序/降序?

问题描述 投票:0回答:2

我有一个包含以下列的 df:时间、用户名、aisle_id、seat_id。

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

第一:时间,升序,

第二:用户名升序,

第三:aisle_id 升序,

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

我尝试将 df 分成 df_odd 和 df_even,使用 df.sort_values 根据第四条规则对两者进行排序,然后连接,然后按第一、第二和第三条规则排序。然而这违反了第四条规则。

是否有一个函数可以做到这一点,或者我一开始尝试的方法是否正确?

python pandas function numpy sorting
2个回答
2
投票

您可以按时间、用户名和 aisle_id 进行分组,然后根据 aisle_id 的值对每个组内的 Seat_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

输出 ans 是

    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

0
投票

寻找有关如何根据以下条件进行过滤、排序的解决方案:

  1. 如果部门是“营销”或“财务”并且 Date_Col2 数据可用,则将 Date_Col2 按升序排序。此条件优先。
  2. 部门是“营销”,按 Date_Col1 升序排序。
  3. 部门为“财务”,按 Date_Col1 降序排序。

以下是输入和预期输出数据: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.