python - 在 Pandas 中按升序和降序有条件地对单个列进行排序

标签 python python-3.x pandas sorting pandas-groupby

我有 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/

相关文章:

python - 如何从 Pandas (同一列)中扣除值(value)?

python-3.x - 如何在 ipython 中运行 Python 脚本?

python - Pandas - 两列作为索引(有效时间和行号)?

python - 如何计算客户状态变更次数

python - 如何使用 Python 将使用 Google App Engine Launcher 在本地主机上制作的记录导入到在线 App Engine 数据存储区?

python - Conda - 离线安装/更新

python - psycopg2.操作错误: fe_sendauth: no password supplied

python - 在对象列表 Python 3 中的所有对象上调用方法的惯用方式

python - 我在数据框中有两列,一列有列名,另一列没有列名,我如何在 python pandas 上命名它们?

python - 使用默认值填充数据框列,其中 findall 不返回任何匹配项