如何使用 Pandas 重命名重置索引上的多个列

Posted

技术标签:

【中文标题】如何使用 Pandas 重命名重置索引上的多个列【英文标题】:How to Rename Multiple Columns on a Reset Index with Pandas 【发布时间】:2015-02-04 02:36:34 【问题描述】:

我试图弄清楚当您尝试重置索引时是否有办法重命名 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()

结果给你:

Out[82]: 
     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()实际上是pandas.pydata.org/pandas-docs/stable/generated/…,所以你只有一列。您可以做的是设置系列索引的列名称,然后它们将保留为 DataFrame 列的名称 【参考方案1】:

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
# ..

【讨论】:

【参考方案2】:

有很多选项,我相信,但如果您只有几列,set_axis() 函数将完成这项工作。

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

【讨论】:

以上是关于如何使用 Pandas 重命名重置索引上的多个列的主要内容,如果未能解决你的问题,请参考以下文章

重命名 Pandas DataFrame 索引

Pandas 重置索引深度总结

重命名Pandas DataFrame索引

在 Pandas 中重命名多个列

pandas 轴索引的重命名,离散化,异常值的处理与随机方法

Pandas把dataframe的索引复合索引变换为数据列:包含单索引到单列(重命名)复合索引到多数据列复合索引的其中一个水平变换为数据列