重新排序行数据

时间:2019-06-19 06:11:42

标签: python pandas csv row

基于此问题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

2 个答案:

答案 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