在pandas数据帧中移动列

时间:2016-02-10 17:21:34

标签: python pandas dataframe

我有以下数据框:

   a  b   x  y
0  1  2   3 -1
1  2  4   6 -2
2  3  6   9 -3
3  4  8  12 -4

如何移动列b和x,使它们成为数据框中的最后2列?我想按名称指定b和x,而不是其他列。

11 个答案:

答案 0 :(得分:43)

您可以通过指定顺序直接重新排列列:

df = df[['a', 'y', 'b', 'x']]

如果列标题是动态的较大数据帧,您可以使用列表推导来选择不在目标集中的每个列,然后将目标集追加到最后。

>>> df[[c for c in df if c not in ['b', 'x']] 
       + ['b', 'x']]
   a  y  b   x
0  1 -1  2   3
1  2 -2  4   6
2  3 -3  6   9
3  4 -4  8  12

为了使其更具防弹性,您可以确保目标列确实在数据框中:

cols_at_end = ['b', 'x']
df = df[[c for c in df if c not in cols_at_end] 
        + [c for c in cols_at_end if c in df]]

答案 1 :(得分:27)

cols = list(df.columns.values) #Make a list of all of the columns in the df
cols.pop(cols.index('b')) #Remove b from list
cols.pop(cols.index('x')) #Remove x from list
df = df[cols+['b','x']] #Create new dataframe with columns in the order you want

答案 2 :(得分:10)

您可以使用以下方式。这很简单,但与Charlie Haley给出的好答案相似。

df1 = df.pop('b') # remove column b and store it in df1
df2 = df.pop('x') # remove column x and store it in df2
df['b']=df1 # add b series as a 'new' column.
df['x']=df2 # add b series as a 'new' column.

现在,您的数据框包含列' b'和' x'到底。您可以在OSPY中看到此视频:https://youtu.be/RlbO27N3Xg4

答案 3 :(得分:2)

另一种更通用的方法;

from pandas import DataFrame


def move_columns(df: DataFrame, cols_to_move: list, new_index: int) -> DataFrame:
    """
    This method re-arranges the columns in a dataframe to place the desired columns at the desired index.
    ex Usage: df = move_columns(df, ['Rev'], 2)   
    :param df:
    :param cols_to_move: The names of the columns to move. They must be a list
    :param new_index: The 0-based location to place the columns.
    :return: Return a dataframe with the columns re-arranged
    """
    other = [c for c in df if c not in cols_to_move]
    start = other[0:new_index]
    end = other[new_index:]
    return df[start + cols_to_move + end]

答案 4 :(得分:1)

您可以将pd.Index.differencenp.hstack一起使用,然后reindex或使用基于标签的索引。通常,最好避免使用NumPy / Pandas对象进行列表理解或其他显式循环。

cols_to_move = ['b', 'x']
new_cols = np.hstack((df.columns.difference(cols_to_move), cols_to_move))

# OPTION 1: reindex
df = df.reindex(columns=new_cols)

# OPTION 2: direct label-based indexing
df = df[new_cols]

# OPTION 3: loc label-based indexing
df = df.loc[:, new_cols]

print(df)

#    a  y  b   x
# 0  1 -1  2   3
# 1  2 -2  4   6
# 2  3 -3  6   9
# 3  4 -4  8  12

答案 5 :(得分:1)

此功能将重新排列您的列,而不会丢失数据。任何省略的列都保留在数据集的中心:

def reorder_columns(columns, first_cols=[], last_cols=[], drop_cols=[]):
    columns = list(set(columns) - set(first_cols))
    columns = list(set(columns) - set(drop_cols))
    columns = list(set(columns) - set(last_cols))
    new_order = first_cols + columns + last_cols
    return new_order

用法示例:

my_list = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])

# Output:
['fourth', 'third', 'first', 'sixth', 'second']

要分配给数据框,请使用:

my_list = df.columns.tolist()
reordered_cols = reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
df = df[reordered_cols]

答案 6 :(得分:1)

与上述罗伯托·威廉姆斯·巴蒂斯塔的答案类似,但希望更加可靠:

df.insert(len(df.columns)-1, 'b', df.pop('b'))
df.insert(len(df.columns)-1, 'x', df.pop('x'))

答案 7 :(得分:1)

简单的解决方案:

old_cols = df.columns.values 
new_cols= ['a', 'y', 'b', 'x']
df = df.reindex(columns=new_cols)

答案 8 :(得分:0)

您也可以单线执行此操作:

df.drop(columns=['b', 'x']).assign(b=df['b'], x=df['x'])

答案 9 :(得分:0)

我以神奇宝贝数据库为例,我的数据库列为

['Name', '#', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Generation', 'Legendary']

代码如下:


import pandas as pd
    df = pd.read_html('https://gist.github.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6')[0] 
    cols = df.columns.to_list()
    cos_end= ["Name", "Total", "HP", "Defense"]

    for i, j in enumerate(cos_end, start=(len(cols)-len(cos_end))):
        cols.insert(i, cols.pop(cols.index(j)))
        print(cols)
        
    df = df.reindex(columns=cols)

    print(df)

答案 10 :(得分:0)

例如,要将列 "name" 移动到 df 中的第一列,您可以使用 insert

column_to_move = df.pop("name")

# insert column with insert(location, column_name, column_value)

df.insert(0, "name", column_to_move)

同样,如果您希望此列成为例如从头开始的第三列:

df.insert(2, "name", column_to_move )