【发布时间】:2015-03-19 22:58:20
【问题描述】:
我有一个带有 MultiIndex 的数据框,如下所示:
>>> dfNew.head()
status shopping TUFNWGTP
state date
6 2003-01-03 emp 0 8155462.672158
2003-01-03 emp 0 8155462.672158
2003-01-03 emp 0 8155462.672158
2003-01-04 emp 0 1735322.527819
2003-01-04 emp 0 1735322.527819
这里看不到,但status 可以取三个值:emp、unemp、NaN。这是州日期级别的数据。我想加入频率不同的新状态日期数据,然后随着时间的推移聚合/分组。
>>> test['foo'].head()
state date
1 2004-01-01 1985886
2 2004-01-01 301172
4 2004-01-01 2614525
5 2004-01-01 1180409
6 2004-01-01 16098932
无方法加入=inner
这是我的工作:
dfNew = dfNew.join(test['foo'], method)
dfNew.reset_index(level=0, inplace=True)
doWhat = {'shopping' : np.sum, 'TUFNWGTP': np.sum, 'foo' : np.mean}
aggASS = dfNew.groupby(['state', pd.TimeGrouper("2AS", label='left'), 'status']).agg(doWhat)
这应该:
- 从另一个数据库中为每个日期时间组合加入
foo,并创建基于 2 年的值。
但这是我得到的:
>>> aggASS.head()
foo shopping TUFNWGTP
state date status
1 2003-01-01 emp 2007116.941176 2.910812e+12 4.500711e+09
unemp NaN 7.836728e+11 5.590089e+08
2005-01-01 emp 2062059.100000 2.026485e+12 4.440291e+09
unemp 2078869.000000 7.543956e+10 2.638597e+08
观察foo 如何具有status=emp 的值,但没有status=unemp 的值,对于相同的state 和date。
加入how=inner
join 默认使用how=inner,所以这似乎是问题所在。但是,如果我
>>> dfNew = dfNew.join(test['foo'], how='outer')
NotImplementedError: Index._join_level on non-unique index is not implemented
是的,state-date 在这里并不是唯一的。但据我所知,我想要的仍然有意义(不是吗?)。这里有什么有效的工作?
建议的解决方案:追加为列
一个建议的解决方案是将它们附加为一列:
使用sort level对齐数据框:
>>> dfNew.head()
status shopping TUFNWGTP
state date
1 2003-01-01 emp 0 3227364.873298
2003-01-01 NaN 0 6841114.725821
2003-01-01 NaN 0 6841114.725821
2003-01-01 NaN 0 6841114.725821
2003-01-01 NaN 0 6841114.725821
>>> test['foo'].head()
state date
1 2004-01-01 1985886
2004-02-01 1990082
2004-03-01 1999936
2004-04-01 2009556
2004-05-01 2009573
然后我们将第二个时间序列添加为列dfNew.append(test['foo'])。有人建议我ignore_index=True,但我认为因为索引标签是正确的,我们不需要它。
但是,这会使我的 Python 实例崩溃。这是数据框的大小:
>>> len(test['foo'])
6864
>>> len(dfNew)
404394
-
dfNew的一些粘贴:http://pastebin.com/rJjh6ZSc -
test的一些粘贴:http://pastebin.com/Er70XD9y
【问题讨论】:
-
我想我可能有一个解决方案。几个问题——join语句中的方法是什么?加入表是否具有像第一个表一样的状态值 - 我看到 test['emp'] 是否像第一个表中的状态?我是否正确假设没有匹配的州日期组合,因为您试图获得总和和平均值?
-
@kennes913 不,它没有。你观察到的是一个遗留的错字。
test最初有一列也称为“emp”,它指的是别的东西。为了清楚起见,我在这里将其重命名为foo- 你找到了我忘记更改的一个地方。test中没有匹配的状态-日期组合,只有一个时间序列foo。对于这个时间序列,我需要找到时间组的平均值。我需要在聚合之前加入,因为它们有不同的频率:dfNew以2003开始,test以2004开始,但我想通过test['foo']的平均值来匹配这些。 -
以下解决方案有效吗?
-
@kennes913 我的
yourtimeseries不包含state- 但我看到了这种方法,我也在想一种方法让append工作 -
如果您进行追加,然后在另一列中对时间段进行分类,您将能够轻松地对这些时间段进行分组和计算。