Pandas GroupBy 多重索引转换:从 Series 轻松还原至 DataFrame
2024-03-17 13:42:46
Pandas GroupBy 多重索引:从 Series 转换回 DataFrame
问题
如果你对 Pandas DataFrame 执行 GroupBy 操作,就会得到一个多重索引的 GroupBy 对象。但是,你可能希望将其转换回一个包含所有行的 DataFrame。
解决方案
将 Pandas GroupBy 多重索引输出从 Series 转换回 DataFrame 的步骤如下:
1. 重置索引
首先,使用 reset_index()
方法重置 GroupBy 对象的索引,将其转换为一个具有原始列名的 DataFrame:
df_reset = g1.reset_index()
2. 设置索引
然后,使用 set_index()
方法将所需的列设置为 DataFrame 的索引:
df_final = df_reset.set_index(['Name', 'City'])
示例
为了演示,我们创建一个示例 DataFrame:
import pandas as pd
df = pd.DataFrame({'City': ['Seattle', 'Seattle', 'Portland', 'Seattle', 'Seattle', 'Portland'],
'Name': ['Alice', 'Bob', 'Mallory', 'Mallory', 'Bob', 'Mallory']})
对其执行 GroupBy 操作:
g1 = df.groupby(['Name', 'City'])
然后,重置索引:
df_reset = g1.reset_index()
最后,将所需的列设置为索引:
df_final = df_reset.set_index(['Name', 'City'])
输出:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
技巧
- 如果只想转换特定的列,可以使用
reset_index(level=level_name)
,其中level_name
是要重置的索引级别。 - 如果希望保留多重索引,可以使用
reset_index()
,但将drop=False
传递给它。
常见问题解答
1. 为什么需要将 GroupBy 输出转换为 DataFrame?
这取决于你的用例。如果你需要对分组后的数据执行进一步的操作(例如,合并或操作),将其转换为 DataFrame 可能更方便。
2. GroupBy 操作如何影响原始 DataFrame?
GroupBy 操作不会修改原始 DataFrame。它返回一个新的对象,其中包含分组后的结果。
3. 如何获得特定分组的索引?
要获取特定分组的索引,可以使用 g1.get_group(group_key)
,其中 group_key
是分组的键。
4. 如何将多个索引列重置为单个列?
可以使用 reset_index(level=[level_name1, level_name2], drop=True)
将多个索引列重置为单个列。
5. 如何保留多重索引中的某些级别?
可以使用 reset_index(level=level_name, drop=False)
保留多重索引中的某些级别。