【问题标题】:Re-order row data重新排序行数据
【发布时间】:2019-11-01 19:17:55
【问题描述】:

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

【问题讨论】:

  • 你能创建一些具有预期输出的小型 DataFrame 吗?

标签: python pandas csv row


【解决方案1】:

你可以使用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)

【讨论】:

    【解决方案2】:

    您可以在 sorted 函数中使用参数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
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多