python pandas: 重命名多索引数据框中的单列标签
python pandas: rename single column label in multi-index dataframe
我有一个看起来像这样的 df:
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([['1','2'],['A','B']])
print df
1 2
A B A B
0 0.030626 0.494912 0.364742 0.320088
1 0.178368 0.857469 0.628677 0.705226
2 0.886296 0.833130 0.495135 0.246427
3 0.391352 0.128498 0.162211 0.011254
如何将列“1”和“2”重命名为 'One' 和 'Two'?
我认为 df.rename() 会有所帮助,但事实并非如此。不知道该怎么做?
使用set_levels
:
>>> df.columns.set_levels(['one','two'], 0, inplace=True)
>>> print(df)
one two
A B A B
0 0.731851 0.489611 0.636441 0.774818
1 0.996034 0.298914 0.377097 0.404644
2 0.217106 0.808459 0.588594 0.009408
3 0.851270 0.799914 0.328863 0.009914
df.columns.set_levels(['one', 'two'], level=0, inplace=True)
这确实是 rename
中缺少的东西(理想情况下它应该让您指定级别)。
另一种方法是设置列索引的级别,但是您需要知道该级别的所有值:
In [41]: df.columns.levels[0]
Out[41]: Index([u'1', u'2'], dtype='object')
In [43]: df.columns = df.columns.set_levels(['one', 'two'], level=0)
In [44]: df
Out[44]:
one two
A B A B
0 0.899686 0.466577 0.867268 0.064329
1 0.162480 0.455039 0.736870 0.759595
2 0.620960 0.922119 0.060141 0.669997
3 0.871107 0.043799 0.080080 0.577421
In [45]: df.columns.levels[0]
Out[45]: Index([u'one', u'two'], dtype='object')
这是个好问题。结合上面的答案,可以写一个函数:
def rename_col( df, columns, level = 0 ):
def rename_apply ( x, rename_dict ):
try:
return rename_dict[x]
except KeyError:
return x
if isinstance(df.columns, pd.core.index.MultiIndex):
df.columns = df.columns.set_levels([rename_apply(x, rename_dict = columns ) for x in df.columns.levels[level]], level= level)
else:
df.columns = [rename_apply(x, rename_dict = columns ) for x in df.columns ]
return df
它对我有用。
理想情况下,将来应该将这样的功能集成到 "official" "rename" 功能中,因此您不需要编写这样的 hack。
df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)
从 pandas 0.22.0(可能更早)开始,您可以指定级别:
df = df.rename(columns={'1': one, '2': two}, level=0)
或者,或者(自 pandas 0.21.0 以来的新符号):
df = df.rename({'1': one, '2': two}, axis='columns', level=0)
但实际上,即使省略级别,它也能正常工作:
df = df.rename(columns={'1': one, '2': two})
在这种情况下,将检查所有列级别是否出现要重命名的情况。
我有一个看起来像这样的 df:
df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([['1','2'],['A','B']])
print df
1 2
A B A B
0 0.030626 0.494912 0.364742 0.320088
1 0.178368 0.857469 0.628677 0.705226
2 0.886296 0.833130 0.495135 0.246427
3 0.391352 0.128498 0.162211 0.011254
如何将列“1”和“2”重命名为 'One' 和 'Two'?
我认为 df.rename() 会有所帮助,但事实并非如此。不知道该怎么做?
使用set_levels
:
>>> df.columns.set_levels(['one','two'], 0, inplace=True)
>>> print(df)
one two
A B A B
0 0.731851 0.489611 0.636441 0.774818
1 0.996034 0.298914 0.377097 0.404644
2 0.217106 0.808459 0.588594 0.009408
3 0.851270 0.799914 0.328863 0.009914
df.columns.set_levels(['one', 'two'], level=0, inplace=True)
这确实是 rename
中缺少的东西(理想情况下它应该让您指定级别)。
另一种方法是设置列索引的级别,但是您需要知道该级别的所有值:
In [41]: df.columns.levels[0]
Out[41]: Index([u'1', u'2'], dtype='object')
In [43]: df.columns = df.columns.set_levels(['one', 'two'], level=0)
In [44]: df
Out[44]:
one two
A B A B
0 0.899686 0.466577 0.867268 0.064329
1 0.162480 0.455039 0.736870 0.759595
2 0.620960 0.922119 0.060141 0.669997
3 0.871107 0.043799 0.080080 0.577421
In [45]: df.columns.levels[0]
Out[45]: Index([u'one', u'two'], dtype='object')
这是个好问题。结合上面的答案,可以写一个函数:
def rename_col( df, columns, level = 0 ):
def rename_apply ( x, rename_dict ):
try:
return rename_dict[x]
except KeyError:
return x
if isinstance(df.columns, pd.core.index.MultiIndex):
df.columns = df.columns.set_levels([rename_apply(x, rename_dict = columns ) for x in df.columns.levels[level]], level= level)
else:
df.columns = [rename_apply(x, rename_dict = columns ) for x in df.columns ]
return df
它对我有用。
理想情况下,将来应该将这样的功能集成到 "official" "rename" 功能中,因此您不需要编写这样的 hack。
df.rename_axis({'1':'one', '2':'two'}, axis='columns', inplace=True)
从 pandas 0.22.0(可能更早)开始,您可以指定级别:
df = df.rename(columns={'1': one, '2': two}, level=0)
或者,或者(自 pandas 0.21.0 以来的新符号):
df = df.rename({'1': one, '2': two}, axis='columns', level=0)
但实际上,即使省略级别,它也能正常工作:
df = df.rename(columns={'1': one, '2': two})
在这种情况下,将检查所有列级别是否出现要重命名的情况。