【问题标题】:pandas how to swap or reorder columns熊猫如何交换或重新排序列
【发布时间】:2019-04-08 00:52:12
【问题描述】:

我知道有一些方法可以在 python pandas 中交换列顺序。 假设我有这个示例数据集:

import pandas as pd    
employee = {'EmployeeID' : [0,1,2],
     'FirstName' : ['a','b','c'],
     'LastName' : ['a','b','c'],
     'MiddleName' : ['a','b', None],
     'Contact' : ['(M) 133-245-3123', '(F)a123@gmail.com', '(F)312-533-2442 jimmy234@gmail.com']}

df = pd.DataFrame(employee)

一种基本的方法是:

neworder = ['EmployeeID','FirstName','MiddleName','LastName','Contact']
df=df.reindex(columns=neworder)

但是,如您所见,我只想交换两列。仅仅因为只有 4 列是可行的,但是如果我有 100 列怎么办?交换或重新排序列的有效方法是什么?

可能有两种情况:

  1. 当您只想交换 2 列时。
  2. 当您想要重新排序 3 列时。 (我很确定这种情况可以应用于 3 列以上。)

谢谢你们。

【问题讨论】:

    标签: python pandas multiple-columns swap


    【解决方案1】:

    写入文件时

    当数据帧写入文件(例如 CSV)时,列也可以重新排序:

    df.to_csv('employees.csv',
              columns=['EmployeeID','FirstName','MiddleName','LastName','Contact'])
    

    【讨论】:

      【解决方案2】:

      如果你想在开头有一个固定的列列表,你可以这样做

      cols = ['EmployeeID','FirstName','MiddleName','LastName']
      df = df[cols + [c for c in df.columns if c not in cols]]
      

      这会将这 4 列放在最前面,其余的保持不变(没有任何重复的列)。

      【讨论】:

      • 对于任何寻找与 tidyverse 的 everything() 命令等效的 R 用户,这就是您要寻找的。​​span>
      【解决方案3】:

      当面临更大规模的相同问题时,我在此链接上遇到了一个非常优雅的解决方案:标题下的http://www.datasciencemadesimple.com/re-arrange-or-re-order-the-column-of-dataframe-in-pandas-python-2/ “在熊猫python中按列位置重新排列数据框的列”。

      基本上,如果您将列顺序作为列表,您可以将其作为新的列顺序读取。

      ##### Rearrange the column of dataframe by column position in pandas python
      
      df2=df1[df1.columns[[3,2,1,0]]]
      print(df2)
      

      在我的例子中,我有一个预先计算的列链接,它决定了我想要的新顺序。如果这个订单被定义为 L 中的一个数组,那么:

      a_L_order = a[a.columns[L]]
      

      【讨论】:

      • 这绝对是简单的胜利。
      【解决方案4】:

      假设您当前的列顺序是 [b,c,d,a] 并且您想将其排序为 [a,b,c,d],您可以这样做:

      new_df = old_df[['a', 'b', 'c', 'd']]
      

      【讨论】:

      • 如果有我很想知道
      • 这可以“就地”实现吗?
      • 您不需要创建新的数据框,只需分配:old_df = old_df[['a', 'b', 'c', 'd']]。
      【解决方案5】:

      两列交换

      cols = list(df.columns)
      a, b = cols.index('LastName'), cols.index('MiddleName')
      cols[b], cols[a] = cols[a], cols[b]
      df = df[cols]
      

      重新排序列交换(2 次交换)

      cols = list(df.columns)
      a, b, c, d = cols.index('LastName'), cols.index('MiddleName'), cols.index('Contact'), cols.index('EmployeeID')
      cols[a], cols[b], cols[c], cols[d] = cols[b], cols[a], cols[d], cols[c]
      df = df[cols]
      

      交换多个

      现在归结为如何使用列表切片 -

      cols = list(df.columns)
      cols = cols[1::2] + cols[::2]
      df = df[cols]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2022-06-13
        • 1970-01-01
        • 2022-10-12
        相关资源
        最近更新 更多