【问题标题】:groupby on a multiindex level and dropping the grouping levelgroupby 在多索引级别上并删除分组级别
【发布时间】:2021-01-28 00:51:48
【问题描述】:

我正在对 pandas 数据框进行 groupby 操作,例如,它可能如下所示:

import pandas as pd
import numpy as np

numbers = [0, 1, 2]
colors = ['green', 'purple']
mx = pd.MultiIndex.from_product([colors, numbers], names=['color', 'numbers'])

values = np.random.rand(6)

df = pd.DataFrame(values, mx)
df = df.drop(index=("green", 2))

(索引示例来自pandas docs on multiindex

然后我想在一个级别上进行组操作,例如"color",但我不希望颜色作为索引保留在分组series 中,因为它变得多余。

for key, series in df.groupby("color"):
    print(f"{key = }")
    print(f"Expected index: {series.index.droplevel('color').to_list()}")
    print(f"Actual index: {series.index.to_list()}")
    print()

哪个输出:

key = 'green'
Expected index: [0, 1]
Actual index: [('green', 0), ('green', 1)]

key = 'purple'
Expected index: [0, 1, 2]
Actual index: [('purple', 0), ('purple', 1), ('purple', 2)]

由于分组级别 "color" 对于每个分组都是相同的,所以它是多余的,我只需要 "numbers" 的级别值。

我可以像这里所做的那样将关卡放到循环中,但我想知道是否还有其他我错过的方法来实现这一点?

【问题讨论】:

  • 你到底想用groupby做什么操作?
  • @QuangHoang 在这种情况下,我正在遍历组来绘制它们,我需要颜色(或动物)作为标签,数字作为 x,值作为 y。但我可以想象还有其他用例。

标签: python pandas pandas-groupby multi-index


【解决方案1】:

IIUC,您可以简单地使用键索引您的数据帧片段:

for key, series in df.groupby("color"):
    print(f'Key: {key}')
    print(series.loc[key])
    print('\n')

输出:

Key: green
                0
numbers          
0        0.913962
1        0.457205


Key: purple
                0
numbers          
0        0.939128
1        0.778389
2        0.715971

【讨论】:

    【解决方案2】:

    看起来您想循环遍历第一级值。你可以试试:

    for color in df.index.get_level_values('color').unique():
        series = df.loc[color]
        print(color)
        print(series)
    

    输出:

    green
                    0
    numbers          
    0        0.161444
    1        0.403312
    purple
                    0
    numbers          
    0        0.369750
    1        0.222223
    2        0.565426
    

    【讨论】:

    • 谢谢,在我的示例中这会起作用,但如果我正在查看标签可能是两个级别的组,这将不起作用。也可以使用df.index.unique("color"),这样可读性更好。
    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2023-04-02
    • 2016-12-01
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多