如果我有一个多级列索引:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
我怎样才能删除该索引的“a”级别,以便最终得到以下结果:
b | c --+---+-- 0 | 1 | 2 1 | 3 | 4
如果我有一个多级列索引:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
我怎样才能删除该索引的“a”级别,以便最终得到以下结果:
b | c --+---+-- 0 | 1 | 2 1 | 3 | 4
MultiIndex.droplevel
方法:>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
a
b c
0 1 2
1 3 4
[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
b c
0 1 2
1 3 4
[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel(0)
- Ted Petrou>>> df.index = df.index.droplevel(1)
- Idododf.columns.droplevel()
功能已不再提供。 - yoonghm>>> df.columns = df.columns.droplevel(2)
>>> df.columns = df.columns.droplevel(0)
- Kyle C截止到Pandas 0.24.0版本,我们现在可以使用DataFrame.droplevel()方法:
cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)
df.droplevel(0, axis=1)
# b c
#0 1 2
#1 3 4
如果您想保持DataFrame方法链的连续性,这将非常有用。
df.droplevel(0, axis='columns')
更加明确易懂。 - Guyaxis=1
。 - igorkf使用列表推导式删除索引的另一种方法:
df.columns = [col[1] for col in df.columns]
b c
0 1 2
1 3 4
如果您想要结合两个级别的名称,例如下面的示例中底层包含两个“y”,那么这种策略也很有用:
cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)
A B
x y y
0 1 2 8
1 3 4 9
删除顶层将使具有索引“y”的两列。 通过使用列表推导式加入名称可以避免这种情况。df.columns = ['_'.join(col) for col in df.columns]
A_x A_y B_y
0 1 2 8
1 3 4 9
在进行groupby操作之后我遇到了一个问题,花费了一些时间才找到这个问题的解决方案。我将那个解决方案适用于这个具体的案例。
[col[1] for col in df.columns]
更直接的写法是 df.columns.get_level_values(1)
。 - Eric O. Lebigot[col[0] if col[1] == '' else col[1] for col in df.columns]
- Logan另一种方法是基于df
的交叉部分重新赋值df
,使用.xs方法。
>>> df
a
b c
0 1 2
1 3 4
>>> df = df.xs('a', axis=1, drop_level=True)
# 'a' : key on which to get cross section
# axis=1 : get cross section of column
# drop_level=True : returns cross section without the multilevel index
>>> df
b c
0 1 2
1 3 4
b
)上进行切片,然后删除该级别并保留第一个级别(a
),则可以使用以下代码:df = df.xs('b', axis=1, level=1, drop_level=True)
- Tiffany G. Wilson使用sum
的小技巧,level=1时有效(当level=1为全部唯一时有效)
df.sum(level=1,axis=1)
Out[202]:
b c
0 1 2
1 3 4
更常用的解决方案是使用get_level_values
。df.columns=df.columns.get_level_values(1)
df
Out[206]:
b c
0 1 2
1 3 4
您还可以通过重命名列来实现:
df.columns = ['a', 'b']
这涉及到手动操作,但如果您最终要重新命名数据帧,则可能是一种选项。
df.columns.get_level_values(1)
给出了。 - Eric O. Lebigot我因为不知道我的droplevel()函数为什么不起作用而苦苦挣扎。经过多次尝试,发现您表格中的“a”是列名,“b”、“c”是索引。如果按照这样的方式操作会有所帮助。
df.columns.name = None
df.reset_index() #make index become label
new_columns_cdnr = []
for column in list(df.columns):
new = [x for x in list(column) if not 'unnamed' in x.lower()]
new_columns_cdnr.append(new[-1])
df.columns = new_columns_cdnr