问题:熊猫:从多级列索引中删除一级?
如果我有一个多级列索引:
>>> 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
回答 0
您可以使用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]
回答 1
删除索引的另一种方法是使用列表理解:
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
这是我在进行分组排序后遇到的一个问题,花了一段时间才找到另一个解决问题的方法。我在这里针对特定情况调整了该解决方案。
回答 2
另一种方法是使用.xs方法df
基于的横截面重新分配。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
回答 3
从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方法链滚动,这将非常有用。
回答 4
您也可以通过重命名列来实现:
df.columns = ['a', 'b']
这涉及手动步骤,但可以选择,特别是如果最终要重命名数据框。
回答 5
一个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
回答 6
由于我不知道为什么我的droplevel()函数不起作用,所以我一直在努力解决此问题。遍历几个,并了解表中的“ a”是列名,“ b”,“ c”是索引。这样做会有所帮助
df.columns.name = None
df.reset_index() #make index become label
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。