>>> 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
但是,如果我有一个很长的'a','b','c','d'.....,我不想明确列出列。我怎么能这样做?
或者Pandas是否提供set_column_sequence(dataframe,col_name, seq)
之类的功能,以便我可以执行:set_column_sequence(df,'x',0)
和set_column_sequence(df,'y',1)
?
答案 0 :(得分:29)
您也可以这样做:
df = df[['x', 'y', 'a', 'b']]
您可以通过以下方式获取列列表:
cols = list(df.columns.values)
输出将产生如下内容:
['a', 'b', 'x', 'y']
...然后在将其放入第一个函数
之前,可以手动重新排列答案 1 :(得分:10)
可能有一个优雅的内置功能(但我还没有找到它)。你可以写一个:
# 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'])
将返回所需的输出。
如果你想要DataFrame的 end 的seq,只需传入“front = False”。
答案 2 :(得分:3)
def _col_seq_set(df, col_list, seq_list):
''' set dataframe 'df' col_list's 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
答案 3 :(得分:2)
您可以执行以下操作:
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)
这将为您提供所需的输出
答案 4 :(得分:0)
我建议您只需编写一个函数来执行您可能正在使用drop
(删除列)和insert
在某个位置插入列的内容。没有现有的API函数可以执行您所描述的内容。
答案 5 :(得分:0)
随意忽略此解决方案,因为从索引中减去列表不会保留原始索引的顺序,如果这很重要的话。
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