在熊猫中使用分隔符对字符串进行排序

时间:2019-01-06 11:37:31

标签: python-3.x pandas dataframe

我有一个熊猫系列,其中带有分隔符的字符串,例如:

['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)

就我实现大数据集的速度而言,熊猫的最佳方法是什么?

2 个答案:

答案 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 sortradix sort(仅当数据由ip组成-域应为限制)。即使以python实现,由于sorted的复杂性,这种算法也将比内置O(n)更快。