python - Pandas 通过 Tuple 重命名 MultiIndex 的单行
问题描述
我正在尝试通过它的元组重命名熊猫数据框的单行。
例如:
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变大,可能会很慢。
我正在使用熊猫 1.0.1、python 3.7。有什么建议么?先感谢您。
解决方案
列表理解的可能解决方案和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
推荐阅读
- python-3.x - “TypeError:'NoneType' 对象不可下标”是什么意思?
- python - 如何将变量从父类传递给子类?
- angular - 对于 angular 中的自定义自动完成功能,模糊事件无法按预期工作
- c# - System.MissingMethodException:'找不到方法:'无效 Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions.set_AllowAreas(Boolean)'。
- javascript - 为什么点击时会从 iframe 中删除属性?
- sql - 使用两个更新,其中第二个更新语句使用第一个更新语句中的列作为输入
- python - 使用 Python 的 fastText:计算准确性
- rust - 无法移出“不和谐”,这是“FnMut”闭包中捕获的变量
- .net-core - 是什么导致 Docker 映像中出现“找不到数据收集器‘XPlat 代码覆盖率’”错误?
- azure-functions - 在 Azure SignalR Serverless 模式下,如何将连接 ID 映射到用户?