基于此问题Can't Re-Order Columns Data,对于dataframe
行如何处理?因为我有问题,不是列顺序而是行顺序。
我的数据如下:
B1 B2
B1 1 1
B10 1 1
B11 1 1
B12 1 1
B2 1 1
B20 1 1
B21 1 1
B22 1 1
B3 1 1
B30 1 1
B31 1 1
我的预期结果:
B1 B2
B1 1 1
B2 1 1
B3 1 1
B10 1 1
B11 1 1
B12 1 1
B20 1 1
B21 1 1
B22 1 1
B30 1 1
B31 1 1
答案 0 :(得分:3)
您可以使用natsort
import natsort as ns
df.reindex(ns.natsorted(df.index))
B1 B2
B1 1 1
B2 1 1
B3 1 1
B10 1 1
B11 1 1
B12 1 1
B20 1 1
B21 1 1
B22 1 1
B30 1 1
B31 1 1
或者:
i=df.index.to_series().str.extract('(\d+)',expand=False).astype(float).sort_values().index
df.reindex(i)
答案 1 :(得分:2)
您可以在排序函数中使用参数key
并将输出传递到DataFrame.reindex
:
df = df.reindex(sorted(df.index, key=lambda x: float(x[1:])))
print (df)
B1 B2
B1 1 1
B2 1 1
B3 1 1
B10 1 1
B11 1 1
B12 1 1
B20 1 1
B21 1 1
B22 1 1
B30 1 1
B31 1 1
替代值为Series.str.extract
数字,转换为浮点数,并按Index.argsort
获取排序值的位置,按DataFrame.iloc
获取最后更改顺序:
df = df.iloc[df.index.str.extract('(\d+)', expand=False).astype(float).argsort()]
print (df)
B1 B2
B1 1 1
B2 1 1
B3 1 1
B10 1 1
B11 1 1
B12 1 1
B20 1 1
B21 1 1
B22 1 1
B30 1 1
B31 1 1