满足一级条件时更改二级多索引标签
Changing second level multiindex label when first level condition is met
我有一个包含两级索引的多索引 df:
dfx = pd.DataFrame(np.random.rand(4, 2),
index=[['a', 'a', 'b', 'b'], ['aa', 'zz', 'gg', 'zz']],
columns=['data1', 'data2'])
dfx
data1 data2
a aa 0.847741 0.723235
zz 0.236876 0.343141
b gg 0.759153 0.546190
zz 0.481285 0.600514
我只想更改一级索引具有特定值的索引标签。即仅在第一个标签为 b
的地方更改 zz 索引
Objective, get:
data1 data2
a aa 0.847741 0.723235
zz 0.236876 0.343141
b gg 0.759153 0.546190
water 0.481285 0.600514
如果我使用 .rename()
所有匹配的索引都会更改
dfx.rename(index={('zz') : 'water'}, inplace = True)
dfx
data1 data2
a aa 0.847741 0.723235
water 0.236876 0.343141
b gg 0.759153 0.546190
water 0.481285 0.600514
我尝试了以下代码行,但这似乎没有任何作用。
dfx.loc['b','zz'].rename(index={'zz' : 'water'}, inplace = True)
dfx.loc['b'].rename(index={'zz' : 'water'}, inplace = True)
我查阅了文档,但一直在努力寻找解决方案。
我在这里做错了什么?
你可以尝试通过pd.MultiIndex.from_tuples()
+列表理解:
dfx.index=pd.MultiIndex.from_tuples(
[(x,y) if (x,y)!=('b','zz') else ('b','water') for x,y in dfx.index]
)
或
另一种方法是重置索引,然后检查值并更改它,然后重新设置索引:
dfx=dfx.reset_index()
dfx.loc[(dfx['level_0'].eq('b') & dfx['level_1'].eq('zz')),'level_1']='water'
dfx=dfx.set_index(['level_0','level_1']).rename_axis(index=[None,None])
我们可以使用MultiIndex.map
d = {('b', 'zz'): ('b', 'water')}
dfx.index = dfx.index.map(lambda i: d.get(i, i))
data1 data2
a aa 0.567847 0.844618
zz 0.752874 0.794704
b gg 0.854358 0.512400
water 0.237905 0.211369
另一种类似的方式:
1:从 Multiindex
创建数据框
2:有条件地赋值
3:转回Multiindex赋值:
d = pd.DataFrame(dfx.index.tolist())
d.loc[d[0].eq("b")&d[1].eq("zz"),1]='water'
dfx.index = pd.MultiIndex.from_frame(d,names=[None,None])
我有一个包含两级索引的多索引 df:
dfx = pd.DataFrame(np.random.rand(4, 2),
index=[['a', 'a', 'b', 'b'], ['aa', 'zz', 'gg', 'zz']],
columns=['data1', 'data2'])
dfx
data1 data2
a aa 0.847741 0.723235
zz 0.236876 0.343141
b gg 0.759153 0.546190
zz 0.481285 0.600514
我只想更改一级索引具有特定值的索引标签。即仅在第一个标签为 b
的地方更改 zz 索引Objective, get:
data1 data2
a aa 0.847741 0.723235
zz 0.236876 0.343141
b gg 0.759153 0.546190
water 0.481285 0.600514
如果我使用 .rename()
所有匹配的索引都会更改
dfx.rename(index={('zz') : 'water'}, inplace = True)
dfx
data1 data2
a aa 0.847741 0.723235
water 0.236876 0.343141
b gg 0.759153 0.546190
water 0.481285 0.600514
我尝试了以下代码行,但这似乎没有任何作用。
dfx.loc['b','zz'].rename(index={'zz' : 'water'}, inplace = True)
dfx.loc['b'].rename(index={'zz' : 'water'}, inplace = True)
我查阅了文档,但一直在努力寻找解决方案。 我在这里做错了什么?
你可以尝试通过pd.MultiIndex.from_tuples()
+列表理解:
dfx.index=pd.MultiIndex.from_tuples(
[(x,y) if (x,y)!=('b','zz') else ('b','water') for x,y in dfx.index]
)
或
另一种方法是重置索引,然后检查值并更改它,然后重新设置索引:
dfx=dfx.reset_index()
dfx.loc[(dfx['level_0'].eq('b') & dfx['level_1'].eq('zz')),'level_1']='water'
dfx=dfx.set_index(['level_0','level_1']).rename_axis(index=[None,None])
我们可以使用MultiIndex.map
d = {('b', 'zz'): ('b', 'water')}
dfx.index = dfx.index.map(lambda i: d.get(i, i))
data1 data2
a aa 0.567847 0.844618
zz 0.752874 0.794704
b gg 0.854358 0.512400
water 0.237905 0.211369
另一种类似的方式:
1:从 Multiindex
创建数据框2:有条件地赋值
3:转回Multiindex赋值:
d = pd.DataFrame(dfx.index.tolist())
d.loc[d[0].eq("b")&d[1].eq("zz"),1]='water'
dfx.index = pd.MultiIndex.from_frame(d,names=[None,None])