Pandas 通过 Tuple 重命名 MultiIndex 的单行

Posted

技术标签:

【中文标题】Pandas 通过 Tuple 重命名 MultiIndex 的单行【英文标题】:Pandas Rename a Single Row of MultiIndex by Tuple 【发布时间】:2020-06-12 13:11:36 【问题描述】:

我正在尝试通过它的元组重命名熊猫数据框的单行。

例如:

import pandas as pd
df = pd.DataFrame(data='i1':[0,0,0,0,1,1,1,1],
                       'i2':[0,1,2,3,0,1,2,3],
                       'x':[1.,2.,3.,4.,5.,6.,7.,8.],
                       'y':[9,10,11,12,13,14,15,16])
df.set_index(['i1','i2'], inplace=True)

创建df:

         x   y
i1 i2         
0  0   1.0   9
   1   2.0  10
   2   3.0  11
   3   4.0  12
1  0   5.0  13
   1   6.0  14
   2   7.0  15
   3   8.0  16

我希望能够使用类似:df.rename(index=(0,1):(0,9),inplace=True) 来获取:

         x   y
i1 i2         
0  0   1.0   9
   9   2.0  10 <-- new key
   2   3.0  11
   3   4.0  12
1  0   5.0  13
   1   6.0  14
   2   7.0  15
   3   8.0  16

该命令执行时不会引发错误,但会返回相同的 df。

这也返回相同的df:df.rename(index=pd.IndexSlice[0,1]:pd.IndexSlice[0,9],inplace=True)

这将接近预期的效果:

df.loc[(0,9),:] = df.loc[(0,1),:]
df.drop(index=(0,1),inplace=True)

但如果行排序很重要,那么将其放入正确的顺序会很痛苦,如果 df 变大,可能会很慢。

我正在使用 Pandas 1.0.1、python 3.7。有什么建议?提前谢谢你。

【问题讨论】:

【参考方案1】:

列表理解和MultiIndex.from_tuples的可能解决方案:

L = [(0,9) if x == (0,1) else x for x in df.index]
df.index = pd.MultiIndex.from_tuples(L, names=df.index.names)
print (df)
         x   y
i1 i2         
0  0   1.0   9
   9   2.0  10
   2   3.0  11
   3   4.0  12
1  0   5.0  13
   1   6.0  14
   2   7.0  15
   3   8.0  16

【讨论】:

以上是关于Pandas 通过 Tuple 重命名 MultiIndex 的单行的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)

使用 Pandas 重命名 excel 的列

在 Pandas 中重命名多个列

重命名 Pandas DataFrame 索引

重命名Pandas DataFrame索引

python 重命名Pandas中的某个列