如何获取 DataFrameGroupBy 对象中键的列名?

How do I get the column names for the keys in a DataFrameGroupBy object?

给定一个分组数据帧(由 df.groupby([col1, col2]) 获得)我想获得分组变量(在本例中为 col1col2)。

例如,来自 GroupBy user guide

import pandas as pd
import numpy as np
df = pd.DataFrame(
    [
        ("bird", "Falconiformes", 389.0),
        ("bird", "Psittaciformes", 24.0),
        ("mammal", "Carnivora", 80.2),
        ("mammal", "Primates", np.nan),
        ("mammal", "Carnivora", 58),
    ],
    index=["falcon", "parrot", "lion", "monkey", "leopard"],
    columns=("class", "order", "max_speed"),
)
grouped = df.groupby(["class", "order"])

给定 grouped 我想得到 classorder。但是,grouped.indicesgrouped.groups 只包含键的值,不包含列名。

列名必须在对象中的某处,因为如果我 运行 grouped.size() 例如,它们包含在索引中:

class   order         
bird    Falconiformes     1
        Psittaciformes    1
mammal  Carnivora         2
        Primates          1
dtype: int64

因此我可以 运行 grouped.size().index.names 其中 returns FrozenList(['class', 'order'])。但这是在进行不必要的 .size() 计算。有没有更好的方法从对象中检索这些?

我喜欢这个的最终原因是我可以对特定组进行一些处理,并将其与定义该组的键值对相关联。这样我就可以将不同分组的数据集与任意级别的分组合并。例如我可以

group                            max_speed
class=bird,order=Falconiformes       389.0
class=bird,order=Psittaciformes       24.0
class=bird                           206.5
foo=bar                               45.5
...

与您自己的建议非常相似,您可以使用以下方法提取按列名分组的内容:

grouped.dtypes.index.names

它并不短,但你避免调用方法。

Grouped DataFrame(通过df.groupby([col1, col2])获得)被转换为pandas.core.groupby.generic.DataFrameGroupBy- Object。所以我们必须把它转换成DataFrame才能得到列名。

df2 = pd.DataFrame(grouped.size().reset_index(name = "Group_Count"))
print(df2)

输出:

    class           order  Group_Count
0    bird   Falconiformes            1
1    bird  Psittaciformes            1
2  mammal       Carnivora            2
3  mammal        Primates            1
print(df2.info())

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column       Non-Null Count  Dtype 
---  ------       --------------  ----- 
 0   class        4 non-null      object
 1   order        4 non-null      object
 2   Group_Count  4 non-null      int64 
dtypes: int64(1), object(2)
memory usage: 224.0+ bytes

我认为这会解决您从分组数据中选择列名的问题。函数 DataFrame.groupBy(cols) returns 一个 GroupedData 对象。为了将 GroupedData 对象转换回 DataFrame,您需要使用 GroupedData 函数之一,例如 mean(cols) avg(cols) count().