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

问题描述 投票:0回答:1

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

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

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

python pandas dataframe group-by multi-index
1个回答
0
投票

您可以使用

get_group()
获取它并重置first_level索引

示例代码:

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(带应用):

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
© www.soinside.com 2019 - 2024. All rights reserved.