如何使用 Pandas 在重置索引时重命名多个列名

9
我正在尝试找出在重置索引时重命名Pandas列的方法。我在文档中看到,如果只有一列,则可以使用“name”参数来设置重置索引的列名称,但我想知道是否有一种方法可以针对多个列进行操作。
例如:
df1 = pd.DataFrame({
'A' : ['a1', 'a1', 'a2', 'a3'],
'B' : ['b1', 'b2', 'b3', 'b4'],
'D1' : [1,0,0,0],
'D2' : [0,1,1,0],
'D3' : [0,0,1,1],
})

df1.set_index(['B','A']).stack().reset_index()

结果留给你的是:
     B   A level_2  0
0   b1  a1      D1  1
1   b1  a1      D2  0
2   b1  a1      D3  0
3   b2  a1      D1  0
4   b2  a1      D2  1

你可以这样做:
df1.set_index(['B','A']).stack().reset_index(name='my_col')

为设置最后一列的名称,不过我在想是否有一种方法可以使用参数来设置“ level_2”列的名称。
我首先想到的是尝试:
df1.set_index(['B','A']).stack().reset_index(name=['my_col2','my_col'])

然而,那样并没有奏效,所以我在寻找另一种方法。我意识到可以在下一行中重新命名列,但是希望有更简洁的方法只用一行完成。


我认为这是不可能的,你看,你代码中的reset_index()实际上是指http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.reset_index.html,所以你只有一列。你可以做的是设置你的系列指数的列名,然后它们将保持为数据框的列名 - Roman Pekar
2个回答

5

reset_index并不能智能地做到这一点,但我们可以利用方法rename_axisrename在重置索引之前为索引和列/系列命名;一旦名称设置正确,reset_index将自动将这些名称转换为结果中的列名:

在这里,rename_axis为索引命名,与df.index.names = ...有些类似,但采用函数式风格;rename为Series对象命名:

df1.set_index(['B','A']).stack().rename_axis(['B','A','col2']).rename('col').reset_index()

#    B   A  col2    col
#0  b1  a1    D1    1
#1  b1  a1    D2    0
#2  b1  a1    D3    0
#3  b2  a1    D1    0
#4  b2  a1    D2    1
# ..

1

有很多选项,但我相信如果你只有几列数据,set_axis()函数就可以胜任。

df1.set_index(['B','A']).stack().reset_index().set_axis(['my_col2','my_col'], axis=1)

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