【问题标题】:Re-order Columns In A Data Frame Depending On Conditions Of Values根据值的条件对数据框中的列重新排序
【发布时间】:2021-04-30 21:07:37
【问题描述】:
a = [[0,0,0,0],[0,-1,1,0],[1,-1,1,0],[1,-1,1,0]]

df = pd.DataFrame(a, columns=['A','B','C','D'])
df

Output:

    A    B    C    D
0   0    0    0    0
1   0   -1    1    0
2   1   -1    1    0
3   1   -1    1    0

因此,每列垂直向下读取,列中的值都从第一行的 0 开始,一旦它们发生变化,它们就永远不会变回,并且可以变为 1 或 -1。我想重新排列数据框列,以便按此顺序排列:

  1. 尽可能对最早行中达到 1 的列进行排序
  2. 对最早行中达到 -1 的列进行排序
  3. 最后剩下的行从未改变过值并保持为零(如果还有剩余的话)
Desired Output:
    C    A    B    D
0   0    0    0    0
1   1    0   -1    0
2   1    1   -1    0
3   1    1   -1    0


我的主数据框是 3000 行和 61 列长,有什么方法可以快速做到这一点?

【问题讨论】:

    标签: python pandas dataframe sorting multiple-columns


    【解决方案1】:

    我们必须分别处理正负值。一种方法是取列的sum,然后使用sort_values,我们可以调整排序:

    a = df.sum().sort_values(ascending=False)
    b = pd.concat((a[a.gt(0)],a[a.lt(0)].sort_values(),a[a.eq(0)]))
    out = df.reindex(columns=b.index)
    
    print(out)
    
       C  A  B  D
    0  0  0  0  0
    1  1  0 -1  0
    2  1  1 -1  0
    3  1  1 -1  0
    

    【讨论】:

      【解决方案2】:

      试试pd.Series.first_valid_index

      s = df.where(df.ne(0))
      s1 = s.apply(pd.Series.first_valid_index)
      s2 = s.bfill().iloc[0]
      out = df.loc[:,pd.concat([s2,s1],axis=1,keys=[0,1]).sort_values([0,1],ascending=[False,True]).index]
      out
      Out[35]: 
         C  A  B  D
      0  0  0  0  0
      1  1  0 -1  0
      2  1  1 -1  0
      3  1  1 -1  0
      

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多