Подтвердить что ты не робот

Как изменить порядок столбцов столбца Pandas?

>>> df =DataFrame({'a':[1,2,3,4],'b':[2,4,6,8]})
>>> df['x']=df.a + df.b
>>> df['y']=df.a - df.b
>>> df
   a  b   x  y
0  1  2   3 -1
1  2  4   6 -2
2  3  6   9 -3
3  4  8  12 -4

Теперь я хочу изменить порядок столбцов, что делает столбец "x", "y" первым и вторым столбцами:

>>> df = df[['x','y','a','b']]
>>> df
    x  y  a  b
0   3 -1  1  2
1   6 -2  2  4
2   9 -3  3  6
3  12 -4  4  8

Но если у меня есть длинные coulmns 'a', 'b', 'c', 'd'....., и я не хочу явно перечислять столбцы. Как я могу это сделать?

Или Pandas предоставляет функцию типа set_column_sequence(dataframe,col_name, seq), чтобы я мог: set_column_sequence(df,'x',0) и set_column_sequence(df,'y',1)?

4b9b3361

Ответ 1

def _col_seq_set(df, col_list, seq_list):
    ''' set dataframe 'df' col_list sequence by seq_list '''
    col_not_in_col_list = [x for x in list(df.columns) if x not in col_list]
    for i in range(len(col_list)):
        col_not_in_col_list.insert(seq_list[i], col_list[i])

    return df[col_not_in_col_list]
DataFrame.col_seq_set = _col_seq_set

Ответ 2

Вы также можете сделать что-то вроде этого:

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

Вы можете получить список столбцов с помощью:

cols = list(df.columns.values)

Результат будет производить примерно следующее:

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

..., который затем легко переставить вручную, прежде чем опустить его в первую функцию

Ответ 3

Может быть элегантная встроенная функция (но я ее еще не нашел). Вы можете написать одно:

# reorder columns
def set_column_sequence(dataframe, seq, front=True):
    '''Takes a dataframe and a subsequence of its columns,
       returns dataframe with seq as first columns if "front" is True,
       and seq as last columns if "front" is False.
    '''
    cols = seq[:] # copy so we don't mutate seq
    for x in dataframe.columns:
        if x not in cols:
            if front: #we want "seq" to be in the front
                #so append current column to the end of the list
                cols.append(x)
            else:
                #we want "seq" to be last, so insert this
                #column in the front of the new column list
                #"cols" we are building:
                cols.insert(0, x)
return dataframe[cols]

В вашем примере: set_column_sequence(df, ['x','y']) вернет желаемый результат.

Если вы хотите, чтобы seq в конце DataFrame вместо этого просто передал "front = False".

Ответ 4

Вы можете сделать следующее:

df =DataFrame({'a':[1,2,3,4],'b':[2,4,6,8]})

df['x']=df.a + df.b
df['y']=df.a - df.b

создайте название столбца независимо от того, какой вы хотите:

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

df.reindex(columns=column_titles)

Это даст вам желаемый результат

Ответ 5

Я бы предложил вам написать функцию, чтобы делать то, что вы говорите, вероятно, используя drop (для удаления столбцов) и insert для вставки столбцов в позицию. Существует не существующая функция API, чтобы делать то, что вы описываете.

Ответ 6

Не стесняйтесь игнорировать это решение, поскольку вычитание списка из индекса не сохраняет порядок исходного индекса, если это важно.

In [61]: df.reindex(columns=pd.Index(['x', 'y']).append(df.columns - ['x', 'y']))
Out[61]: 
    x  y  a  b
0   3 -1  1  2
1   6 -2  2  4
2   9 -3  3  6
3  12 -4  4  8