按第一级分组时如何访问索引的第二级

How do I access the second level of an index when grouping by the first level

提问人:user242318 提问时间:11/13/2023 最后编辑:user242318 更新时间:11/13/2023 访问量:58

问:

我有一个PD。以 MultiIndex 作为索引的 DataFrame df。当我按第一级分组时,如何获得第二级 MultiIndex 作为索引?groupby 对象是

gdf = df.groupby(level=['first_level]).

我想通过一个接受 pd 的函数进行转换。DataFrame 并输出一个 pd。系列。输入应该是 pd。索引为原始 MultiIndex 的第二级的 DataFrames,而 Ouput 应该由原始 MultiIndex 的第一级索引索引。

Python Pandas DataFrame Group-by 多索引

评论

0赞 Corralien 11/13/2023
这取决于你之后想做什么。groupby

答:

1赞 Ömer Sezer 11/13/2023 #1

您可以使用并重置first_level索引来获取它get_group()

示例代码:

import pandas as pd

arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('first_level', 'second_level'))
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
print(df)

gdf = df.groupby(level='first_level')
gr_A = gdf.get_group('A')  # access first_level 'A'
gr_A = gr_A.reset_index(level='first_level', drop=True) # reset first_level index 
print(gr_A)

艺术

gdf = df.groupby(level='first_level')
gr_A = gdf.get_group('A').droplevel('first_level')
print(gr_A)

输出:

                          value
first_level second_level
A           1                10
            2                20
B           1                30
            2                40
              value
second_level
1                10
2                20

编辑:

您可以获得一个系列并应用/转换任何过程:

示例 1(使用 apply):

result_series_A = df[df.index.get_level_values('first_level') == 'A']['value'].apply(lambda x: x * 2)
#result_series_A = df[df.index.get_level_values('first_level') == 'A']['value']  # with reset_index, get the data as series
result_series_A = result_series_A.reset_index(drop=True)
print(result_series_A)

示例 2(使用转换):

df['transformed_value'] = df.groupby(level='first_level')['value'].transform(lambda x: x * 2)
result_series_A = df[df.index.get_level_values('first_level') == 'A']['transformed_value']
result_series_A = result_series_A.reset_index(drop=True)
print(result_series_A)

输出:

                          value
first_level second_level
A           1                10
            2                20
B           1                30
            2                40
0    20
1    40

评论

0赞 user242318 11/13/2023
谢谢!如果我想通过一个函数进行转换,该函数接受由第二级索引的 DataFrames 并输出 Series,该怎么办?我正在考虑 gdf.transform(func),输出一个由第一级索引的 DataFrame。
0赞 Ömer Sezer 11/13/2023
@user242318是的,我更新了帖子(在编辑部分之后)。你可以和DF一起玩。我提出了一些可能性。