我有一个包含以下列的 df:时间、用户名、aisle_id、seat_id。
我想按以下方式对表格进行排序:
第一:时间,升序,
第二:用户名升序,
第三:aisle_id 升序,
第四:seat_id,aisle_id为奇数时升序,aisle_id为偶数时降序。
我尝试将 df 分成 df_odd 和 df_even,使用 df.sort_values 根据第四条规则对两者进行排序,然后连接,然后按第一、第二和第三条规则排序。然而这违反了第四条规则。
是否有一个函数可以做到这一点,或者我一开始尝试的方法是否正确?
您可以按时间、用户名和 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