如何获取 DataFrameGroupBy 对象中键的列名?
How do I get the column names for the keys in a DataFrameGroupBy object?
给定一个分组数据帧(由 df.groupby([col1, col2])
获得)我想获得分组变量(在本例中为 col1
和 col2
)。
例如,来自 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
我想得到 class
和 order
。但是,grouped.indices
和 grouped.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()
.
给定一个分组数据帧(由 df.groupby([col1, col2])
获得)我想获得分组变量(在本例中为 col1
和 col2
)。
例如,来自 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
我想得到 class
和 order
。但是,grouped.indices
和 grouped.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()
.