Pandas:从多级列索引中删除一个级别?
- 2025-02-12 10:03:00
- admin 原创
- 49
问题描述:
如果我有一个多级列索引:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
一个
---+--
b | c
--+---+--
0 | 1 | 2
1 | 3 | 4
我怎样才能降低该索引的“a”级别,以便最终得到:
b | c
--+---+--
0 | 1 | 2
1 | 3 | 4
解决方案 1:
您可以使用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]
解决方案 2:
从 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 方法链保持滚动,这非常有用。
解决方案 3:
删除索引的另一种方法是使用列表推导:
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 后遇到的一个问题,花了一段时间才找到另一个可以解决该问题的问题。我根据此处的具体情况调整了该解决方案。
解决方案 4:
另一种方法是使用.xsdf
方法根据的横截面进行重新分配。df
>>> 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
解决方案 5:
使用 level=1 的一个小技巧sum
(当 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
解决方案 6:
您还可以通过重命名列来实现这一点:
df.columns = ['a', 'b']
这涉及手动步骤,但这可能是一个选择,特别是当您最终重命名数据框时。
解决方案 7:
我一直在努力解决这个问题,因为我不知道为什么我的 droplevel() 函数不起作用。通过几个例子,你就会发现表中的“a”是列名,“b”、“c”是索引。这样做会有所帮助
df.columns.name = None
df.reset_index() #make index become label
解决方案 8:
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
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD