Вы можете использовать sorted
, чтобы создать новый порядок для индекса, а затем выполнить сортировку (переупорядочение) с помощью df.take
:
import pandas as pd
df = pd.DataFrame({'foo':['100-200','1000-1100','1100-1200','200-300']})
order = sorted(range(len(df)),
key=lambda idx: map(int, df.ix[idx, 'foo'].split('-')))
df = df.take(order)
print(df)
дает
foo
0 100-200
3 200-300
1 1000-1100
2 1100-1200
Это похоже на решение @ 275365, но обратите внимание, что сортировка выполняется по range(len(df))
, а не по строкам. Строки используются только в параметре key
для определения порядка, в котором range(len(df))
следует переставлять.
Использование sorted
отлично работает, если DataFrame небольшой. Вы можете повысить производительность, когда DataFrame
имеет средний размер (например, несколько сотен строк на моем компьютере), используя вместо этого numpy.argsort
:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo':['100-200','1000-1100','1100-1200','200-300']*100})
arr = df['foo'].map(lambda item: map(int, item.split('-'))).values
order = np.argsort(arr)
df = df.take(order)
В качестве альтернативы вы можете разделить свой строковый столбец на два столбца с целыми значениями, а затем использовать df.sort
:
import pandas as pd
df = pd.DataFrame({'foo':['100-200','1000-1100','1100-1200','200-300']})
df[['start', 'end']] = df['foo'].apply(lambda val: pd.Series(map(int, val.split('-'))))
df.sort(['start', 'end'], inplace=True)
print(df)
дает
foo start end
0 100-200 100 200
3 200-300 200 300
1 1000-1100 1000 1100
2 1100-1200 1100 1200
person
unutbu
schedule
31.12.2013