PKB:
私はそれのタプルでパンダデータフレームの単一の列の名前を変更しようとしています。
例えば:
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