Это расширение ответа @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 мс, 1.000.000 ip ~ 84 мс).
Если вы хотите, чтобы он работал быстрее, потому что набор данных огромен и O(n)/O(n*log(n))
разница имеет значение, вы можете реализовать сортировку по счету или сортировку по основанию (только если данные состоят из ip или около того - домен должен быть ограничен). Даже реализованный в python
, такой алгоритм будет быстрее встроенного sorted
из-за сложности O(n)
.