Pandas如何交换或重新排序列?

43

我知道在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列呢?有什么有效的方法可以交换或重新排序列吗?

可能会有2种情况:

  1. 当您只想交换2列时。
  2. 当您想要重新排序3列时。(我相信这种情况适用于3列以上。)
9个回答

71

如果你当前的列顺序为[b,c,d,a],想要将其按照[a,b,c,d]排序,可以按照以下方式进行:

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

6
能否“原地”完成此操作? - naccode
12
无需创建新数据框,只需进行变量赋值即可:old_df = old_df[['a', 'b', 'c', 'd']]。该操作不会改变原有数据框的内容,只是选取了指定列重新赋值给同一个变量。 - MikeB2019x

35

两列交换

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]

16
如果您想在开头拥有一个固定的列列表,您可以进行如下操作:
cols = ['EmployeeID','FirstName','MiddleName','LastName']
df = df[cols + [c for c in df.columns if c not in cols]]

这将把这4列放在第一位,并保留其余部分不变(无重复列)。


2
对于寻找与 tidyverse 的 everything() 命令等效的命令的任何 R 用户,这就是您要寻找的。 - Jeremy K.

12
当面对更大规模的相同问题时,我在此链接中找到了一个非常优雅的解决方案:http://www.datasciencemadesimple.com/re-arrange-or-re-order-the-column-of-dataframe-in-pandas-python-2/,在标题“按列位置重新排列表格数据框架”的下方。基本上,如果您有列顺序的列表,可以将其读入作为新的列顺序。
##### Rearrange the column of dataframe by column position in pandas python

df2=df1[df1.columns[[3,2,1,0]]]
print(df2)

在我的情况下,我有一个预计算的列联结,用于确定我想要的新顺序。如果这个顺序在L中被定义为一个数组,则:

在我的案例中,我有一个预先计算的列关联,用于确定我所需的新顺序。如果此顺序在L中定义为数组,则:

a_L_order = a[a.columns[L]]

这绝对是简单易懂的胜利者。 - RWL01

1

写入文件时

在将数据框输出到文件(例如CSV)时,列也可以重新排序:

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

我使用了一个Python脚本将HTML中的表格导出为CSV,并在这个新的CSV表格中计算不同的指标。源页面中的列发生了变化。这解决了我的问题,我不需要改变任何计算指标的内容。 - Lucas Gomes

1

如果你的列数不太多,而且不想列出列名,那么一种简洁的重新排列列的方法是使用 .iloc[]

df_reorderd = df.iloc[:, [0, 1, 3, 2, 4]]

0

根据需要定位pandas系列

#using pandas.iloc
df.iloc[:,[1,3,2,0]]

pandas.iloc函数的第一个参数用于指定行,第二个参数用于指定列,因此我们提供了一个按照列顺序显示的列表。


0
我认为这样的函数将非常有用,可以控制列的位置:
def df_changeorder(frame: pd.DataFrame, var: list, remove=False, count_order='left', offset=0) -> pd.DataFrame:
    """
    :param frame: dataframe
    :param var: list of columns to move to the front
    :param count_order: where to start counting from left or right to insert
    :param offset: cols to skip in the count_order specified
    :return: dataframe with order changed
    """

    varlist = [w for w in frame.columns if w not in var]

    if remove:
        frame = frame[var]
    else:

        if offset == 0:

            if count_order == 'left':

                frame = frame[var + varlist]

            if count_order == 'right':

                frame = frame[varlist + var]

        else:
            if count_order == 'left':
                frame = frame[varlist[:offset] + var + varlist[offset:]]

            if count_order == 'right':
                frame = frame[varlist[:-offset] + var + varlist[-offset:]]

    return frame

一个简单的用例就是定义我们想要重新排序的列,例如,使用提供的DataFrame,如果我们想要按照以下顺序进行排序:
['EmployeeID','Contact','LastName','FirstName','MiddleName']
注意,我们只需要移动“Contact”和“LastName”,因此我们可以轻松地得到这个结果:
# columns to swap
swap_columns = ["Contact","LastName"]

# change the order
df = df_changeorder(df, swap_columns, count_order='left', offset=1)

通过这种方法,我们可以重新排列任意数量的列,只需要指定列的列表,然后像示例中一样应用函数即可。


0
这里有一个两行的解决方案,无论数据框的大小如何(无论有多少列),只要您知道要交换的列的名称,它就可以工作。如果您的数据框(df)中有“col1”和“col2”两列:
df['col1'], df['col2'] = df['col2'].values, df['col1'].values
df = df.rename(columns={'col1': 'temp_col1', 'col2': 'col1', 'temp_col1': 'col2'})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接