我有98000个美国家庭街道地址,我需要按照“步行”的顺序进行排序,也就是说,按照你要走的顺序,沿着街道的一侧走,然后穿过街道往回走。
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结果,对奇数街道编号进行升序排序,然后对偶数街道编号切换到降序排序。[抱歉,第一个问题,还没有资格复制Jupyter笔记本的图像]
4列:数字、街道、城镇、偶数
“编号”列的预期结果:1231 1233 1235 1237 1239 1238 1236 1234 1232 1230
这是我的尝试,如果我理解正确的话,我相信这可以在lambda函数中完成,但它有助于详细阐述逻辑:)
import pandas as pd
import numpy as np
number_list = list(range(1, 11))
data = pd.DataFrame(
{
'town': sorted(['Springfield', 'Shelbyville'] * 10),
'street': sorted(['Evergreen Terrace', 'Main Street'] * 10),
'number': number_list + number_list
}
)
data['is_even'] = data['number'] % 2 == 0
final = pd.DataFrame()
for key, data_group in data.groupby(['town', 'street', 'is_even']):
if key[2] == True:
final = final.append(data_group.sort_values('number', ascending = False))
else:
final = final.append(data_group.sort_values('number'))
final.drop('is_even', axis = 1, inplace = True)
final
给予:
使用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从序列的最后一个元素开始工作;e、 g.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
我想按第三个和第一个元素对元组数组进行排序,因此我使用了以下代码: 我的问题是,在前面的例子中,我可以按第三个元素和第一个元素的升序排序,也可以按它们的降序排序(使用反向)。但是如何按第三个元素的升序和第一个元素的降序排序。 请在你的回答中考虑以下情况: 在这种情况下,我不知道内部数组的确切大小(取决于我读入该数组的文件模式),我想按侧中的所有项进行排序(一些升序和一些降序)。 编辑:看起来,我明
我正在尝试对我的数组进行升序和降序排序。不过,我似乎不知道如何正确地执行此操作。我尝试了不同的方法,但都不起作用。当我单击两个按钮时,应该会发生这种情况,一个ID为“stigande”升序,一个ID为“ 爪哇语
我想根据两个属性对列表进行排序,但要满足一定的条件。下面的类有两个属性--memberid和membernumber。其值如下所示。
考虑下面的哈希图: 具有诸如 我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序: 到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?
我有数据。表中有大约300万行和40列。我希望在组内按降序对该表排序,如以下sql模拟代码: 数据中是否存在等效的方法。这张桌子可以吗?到目前为止,我必须将其分解为两个步骤: 这非常快,只需要几秒钟。 这一步需要更长的时间(5分钟)。 更新:有人评论要执行<code>X 我的方法是:setkey()然后是order(-Month) 我现在的问题是:如果我想按年、MemberId和一个又一个排序(年
问题内容: 这是我用于Java 5.0的代码片段 Collections.reverseOrder() 用于获取比较器,以反转元素的存储和迭代方式。 有没有更优化的方法呢? 问题答案: 您为什么认为这种方法不会得到优化?相反的顺序简单地将被翻转从实际输出的符号(或输出上的物体插入),因此我会想象它是非常快的。 另一个建议:与其更改存储元素的顺序,不如使用该方法以降序迭代它们。