我有 98,000 个美国家庭街道地址,需要按“步行”顺序排序,即按照您步行的顺序列出,沿着街道的一侧,然后过马路并走回来。
import pandas as pd
df = pd.read_excel('c:pdsort.xlsx')
# add boolean column for even or odd on number column
is_even = df.loc[:,'number'] % 2 == 0
df.loc[:, 'even'] = is_even
# group and then sort by number
df.groupby(['town','street','even']).apply(lambda x: x.sort_values('number'))
# sort odd numbers ascending and even numbers descending
所需的 df 结果,对奇数街道号码升序排序,然后对偶数切换到降序排序。 [抱歉,第一个 stackoverflow 问题,尚不具备复制 Jupyter 笔记本图像的资格]
4 列:数字、街道、城镇、偶数
列“number”的期望结果: 1231 1233 1235 第1237章 1239 1238 1236 1234 第1232章 1230
最佳答案
使用numpy.lexsort
,您可以定义用于排序的系列序列。数据来自@smj。
设置
import pandas as pd
import numpy as np
number_list = list(range(1, 11))
df = pd.DataFrame({'town': sorted(['Springfield', 'Shelbyville'] * 10),
'street': sorted(['Evergreen Terrace', 'Main Street'] * 10),
'number': number_list + number_list})
解决方案
订购时要小心。 np.lexsort
从序列的最后一个元素开始工作;例如s1
的排序优先级最高,s4
最低。
s1 = df['town']
s2 = df['street']
s3 = ~df['number']%2 # i.e. "is odd"
s4 = np.where(s3, -df['number'], df['number']) # i.e. "negate if odd"
res = df.iloc[np.lexsort((s4, s3, s2, s1))]
结果
print(res)
town street number
0 Shelbyville Evergreen Terrace 1
2 Shelbyville Evergreen Terrace 3
4 Shelbyville Evergreen Terrace 5
6 Shelbyville Evergreen Terrace 7
8 Shelbyville Evergreen Terrace 9
9 Shelbyville Evergreen Terrace 10
7 Shelbyville Evergreen Terrace 8
5 Shelbyville Evergreen Terrace 6
3 Shelbyville Evergreen Terrace 4
1 Shelbyville Evergreen Terrace 2
10 Springfield Main Street 1
12 Springfield Main Street 3
14 Springfield Main Street 5
16 Springfield Main Street 7
18 Springfield Main Street 9
19 Springfield Main Street 10
17 Springfield Main Street 8
15 Springfield Main Street 6
13 Springfield Main Street 4
11 Springfield Main Street 2
关于python - 在 Pandas 中按升序和降序有条件地对单个列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957641/