如何使用 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_axis
和 rename
在重置索引之前为索引和列/系列命名;一旦名称设置正确,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 轴索引的重命名,离散化,异常值的处理与随机方法
Pandas把dataframe的索引复合索引变换为数据列:包含单索引到单列(重命名)复合索引到多数据列复合索引的其中一个水平变换为数据列