我有一个熊猫系列,其中带有分隔符的字符串,例如:
['160.20.2257.92', '829.328.17.39']
我想对它们进行排序。如果我像下面的代码中那样使用Seres.sort_values():
a = pd.Series(['6.0.0.0', '10.0.4.0'])
a.sort_values()
我得到的输出为:
1 10.0.4.0
0 6.0.0.0
这是非常可预期的,因为排序功能将6与1进行比较而不将6与10进行比较,并且由于1较小,因此将按排序顺序首先显示。我想要的是将其按分隔符('。')的第一部分进行排序,然后再进行第二部分的排序,依此类推(即比较10&6,然后是0&0,然后是4&0,最后0&0)
就我实现大数据集的速度而言,熊猫的最佳方法是什么?
答案 0 :(得分:2)
我相信这就是您要寻找的
@submission.agent_activities.first.agent_id = current_agent.id
respond_to do |format|
if @submission.update(submission_params)
format.html { redirect_to @submission, notice: 'Submission was successfully updated.' }
format.json { render :show, status: :ok, location: @submission }
else
format.html { render :edit }
format.json { render json: @submission.errors, status: :unprocessable_entity }
end
end
我希望这能涵盖所有极端情况
答案 1 :(得分:1)
这是@Ananay Mital答案的扩展-如果您希望保存索引。
def sort_data(series):
sorted_data = sorted(
zip(series.index, map(lambda x: tuple(map(int, x.split('.'))), series)),
key=lambda x: x[1])
return pd.Series(
map(lambda x: '.'.join(map(str, x[1])), sorted_data),
index=[i[0] for i in sorted_data])
sorted_data = sort_data(series)
示例:
series
Out:
0 2.49.30.91
1 2.16.99.113
2 62.38.107.41
3 127.21.16.56
4 14.97.112.42
5 49.25.90.11
6 92.87.23.61
7 87.121.78.112
8 17.73.95.37
9 28.117.48.89
dtype: object
排序系列:
sort_data(series)
Out:
1 2.16.99.113
0 2.49.30.91
4 14.97.112.42
8 17.73.95.37
9 28.117.48.89
5 49.25.90.11
2 62.38.107.41
7 87.121.78.112
6 92.87.23.61
3 127.21.16.56
dtype: object
没有简单的方法可以使用标准的pandas
方法来完成您想要的工作;同样,我对大熊猫的某些尝试并没有@Ananay Mital的解决方案那么快。
此方法足够快(排序时间大约为100.000 ip的〜4 ms,1.000.000 ip的〜84 ms)。
如果由于数据集庞大且O(n)/O(n*log(n))
的差异很重要而希望它能更快地工作,则可以实现counting sort或radix sort(仅当数据由ip组成-域应为限制)。即使以python
实现,由于sorted
的复杂性,这种算法也将比内置O(n)
更快。