连接两个具有不同索引级别数的 MultiIndex DataFrame
Posted
技术标签:
【中文标题】连接两个具有不同索引级别数的 MultiIndex DataFrame【英文标题】:Joining two MultiIndex DataFrames with different number of index levels 【发布时间】:2018-10-15 19:42:11 【问题描述】:我有一个pandas
数据框:
emp laborforce emp_rate
occ statefip quarter
10 1 0 6.561213e+06 7.017537e+06 0.934974
4 8.580723e+06 9.114996e+06 0.941385
8 8.588012e+06 9.102831e+06 0.943444
12 2.093297e+06 2.220923e+06 0.942535
2 0 6.561208e+06 7.017527e+06 0.934974
现在我想将每个(occ, statefip)
的平均emp_rate
合并到这个数据集中。我试过了
df2 = df1.groupby(level=[0, 1])['emp_rate'].mean()
df2.name = 'emp_rate_mean'
df1.join(df2, how='inner')
NotImplementedError: merging with more than one level overlap on a multi-index is not implemented
显然,如果第二个数据帧是单索引的,则这种类型的 join
会从 pandas
0.14 开始工作。它不是。在这种情况下,正确的方法是什么?
【问题讨论】:
【参考方案1】:使用GroupBy.transform():
In [102]: df['emp_rate_avg'] = df.groupby(level=[0, 1])['emp_rate'].transform('mean')
In [103]: df
Out[103]:
emp laborforce emp_rate emp_rate_avg
occ statefip quarter
10.0 1.0 0 6561213.0 7017537.0 0.934974 0.940584
4 8580723.0 9114996.0 0.941385 0.940584
8 8588012.0 9102831.0 0.943444 0.940584
12 2093297.0 2220923.0 0.942535 0.940584
2.0 0 6561208.0 7017527.0 0.934974 0.934974
【讨论】:
所以这通过建议transform()
来规避问题,并且永远不会“丢失”索引中的维度。如果我得到了 .mean()
数据集并且必须以某种方式合并它怎么办?
@FooBar, df1.reset_index('quarter').join(df2).set_index('quarter', append=True)
- 我不知道更好/更有效的方法...以上是关于连接两个具有不同索引级别数的 MultiIndex DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas - 如何在具有不同级别数的索引上加入 DataFrames?
无法访问具有级别名称的 MultiIndex DataFrame
为啥在具有一级索引的 MultiIndex 列的 pandas DataFrame 中表现不同?
pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex