python pandas如何交换或重新排序列

kninwzqo  于 2023-04-19  发布在  Python
关注(0)|答案(9)|浏览(271)

我知道在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.当你只想交换两列时。
1.当你想要3列重新排序时。(我很肯定这种情况可以应用于3列以上。)

pieyvz9o

pieyvz9o1#

假设你的当前列的顺序是[B,c,d,a],你想把它排序成[a,b,c,d],你可以这样做:

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

dgenwo3n2#

两列交换

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]
2j4z5cfb

2j4z5cfb3#

如果希望在开始时有一个固定的列列表,可以执行以下操作:

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

这将把这4列放在第一位,其余的保持不变(没有任何重复的列)。

92dk7w1h

92dk7w1h4#

当在更大的规模上面临同样的问题时,我在这个链接上遇到了一个非常优雅的解决方案: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”标题下。
基本上,如果你有列顺序作为一个列表,你可以读它作为新的列顺序。

##### 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]]
ckocjqey

ckocjqey5#

当您没有太多列并且不想列出列名时,对列进行重新排序的一种简洁方法是使用 .iloc[]

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

jgovgodb6#

写入文件时

当 Dataframe 被写出到文件(例如CSV)时,列也可以被重新排序:

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

fruv7luv7#

我认为这样的函数对于控制列的位置非常有用:

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']
注意,我们只需要移动ContactLastName,因此我们可以很容易地得到结果:

# columns to swap
swap_columns = ["Contact","LastName"]

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

使用这种方法,我们可以根据需要重新排序任意多的列,我们只需要指定列的列表,然后应用示例中的函数。

rks48beu

rks48beu8#

根据需要定位pandas系列

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

pandas.iloc函数的第一个参数表示行,第二个参数表示列,因此我们给出了列的显示顺序列表。

ttcibm8c

ttcibm8c9#

这里有一个两行的解决方案,只要你知道你想要交换的列的名字,不管 Dataframe 的大小(不管有多少列)都可以工作。如果你的 Dataframe 中的两列是“col1”和“col2”(df):

df['col1'], df['col2'] = df['col2'].values, df['col1'].values
df = df.rename(columns={'col1': 'temp_col1', 'col2': 'col1', 'temp_col1': 'col2'})

相关问题