首页 > 解决方案 > 如何在python中对列表块进行排序?

问题描述

我有一个费率列表,其中包含近 35040 个值。我已将列表分成 365 个块,其中包含 96 个元素。现在我想从每个块中获取前 4 个最小值并首先实现这一点,我按递增顺序对块进行排序,并将列表中的前 4 个元素打印或插入到新列表中。我的方法:

import pandas as pd

inputFile = "inputFile.xlsx"
fileName = inputFile
inputSheetDF = pd.read_excel(fileName, sheet_name='Sheet1')

iexRate = inputSheetDF['IEX Price']
#iexRate = [2.3, 2.4, 3, 4, 3.2, 4.1, 5.......]

testList = []

n = 96

x = [iexRate[i:i + n] for i in range(0, len(iexRate), n)]
x.sort()

但这x.sort()给了我一个错误。

ValueError: Can only compare identically-labeled Series objects

所以基本上我想要一个输出,testList其中包含每个 96 块中的前 4 个最小元素。

标签: pythonpython-3.xlistsorting

解决方案


这是一个建议的解决方案,它具有矢量化的优点。我正在使用一个小得多的数据集 - 3 个块,每个块 4 个,从每个块中采样顶部(按钮)2 - 但更大数据集的想法当然是相同的。

df = pd.DataFrame({"rate": np.random.randint(1, 100, 12), "chunk":  [1]*4 + [2]*4 + [3]*4 })
print(df)

==> 

    rate  chunk
0     81      1
1     51      1
2     50      1
3     83      1
4     33      2
5     88      2
6     97      2
7      2      2
8     22      3
9     23      3
10     4      3
11    83      3

df.sort_values("rate", inplace=True)
df.groupby("chunk").head(2).sort_values("chunk")

==>

    rate  chunk
2     50      1
1     51      1
7      2      2
4     33      2
10     4      3
8     22      3

要获得所有费率的统一列表,只需执行以下操作:

flat_list = list(res.rate)
==> [50, 51, 2, 33, 4, 22]

推荐阅读