【发布时间】:2016-05-27 19:08:50
【问题描述】:
我有 MultiColumns:第二层重复包含 Job Openings 和 Hires。我想为每个顶级列减去一个 - 但我所做的一切都会让我陷入索引错误或切片错误。如何计算?
样本数据:
>>> df.head()
Out[25]:
Total nonfarm Total private
Hires Job openings Hires Job openings
date
2001-01-01 5777 5385 5419 4887
2002-01-01 4849 3759 4539 3381
2003-01-01 4971 3824 4645 3424
2004-01-01 4827 3459 4552 3153
2005-01-01 5207 3670 4876 3358
预期输出:
Out[25]:
Total nonfarm Total private
difference difference
date
2001-01-01 1234 5678
2002-01-01 1234 5678
2003-01-01 1234 5678
2004-01-01 1234 5678
2005-01-01 1234 5678
数字明显不正确。
特别是在 apply() 中
为了有一个普遍适用的方式,我试图设置
def apply(group):
result = group.loc[:, pd.IndexSlice[:, 'Job openings']].div(group.loc[:, pd.IndexSlice[:, 'Hires']].values)
result.columns = pd.MultiIndex.from_product([[group.columns.get_level_values(0)[0]], ['Ratio']])
return result.values
foo = df.groupby(axis=1, level=0).apply(apply)
这有两个问题:
- 我需要用
.values作弊,才能正确地分开 -
foo不是正确的数据框:住宿和餐饮服务 [[0.76], [0.480349344978], [0.501388888889], [... 艺术、娱乐和休闲 [[0.558139534884],[0.46017699115],[0.2483221... 建设 [[0.35], [0.274881516588], [0.267260579065], [...
我首先尝试返回result,而不是result.values,但这只会导致一个充满NaN的数据框
特别是使用列名
我不喜欢最高投票的答案是它需要 .diff() 或 .div() - hacks,这使得代码难以阅读,并且当有超过两列时难以实现子级。
【问题讨论】: