您可以使用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)) 应重新排列的顺序。
如果 DataFrame 很小,使用 sorted 可以正常工作。当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