Python 按X、Y分组,并选择X1和X2(具有不同频率)的最后一周
我有一个看起来像这样的数据帧(通常):Python 按X、Y分组,并选择X1和X2(具有不同频率)的最后一周,python,pandas,Python,Pandas,我有一个看起来像这样的数据帧(通常): 源A的频率约为2/天 源B的频率更高 我想按来源和id分组;然后为每个选择最后一周的数据 我尝试了一个快速跟踪(20),但为了我的目的(减去上周每位患者的直方图(pmf)),我想更精确一些 如何获取索引的最后一周?假设您有这样一个数据帧: In [50]: s="""time source id ...: 4-25-2014 A 1 ...: 5-4-2014 A 1 ...:
- 源A的频率约为2/天
- 源B的频率更高
如何获取索引的最后一周?假设您有这样一个数据帧:
In [50]: s="""time source id
...: 4-25-2014 A 1
...: 5-4-2014 A 1
...: 5-5-2014 A 1
...: 4-2-2013 B 12
...: 4-6-2013 B 12
...: 4-11-2013 B 12
...: 4-12-2013 B 12
...: 4-12-2013 B 12"""
In [51]: df = pd.read_csv(StringIO(s), sep="\s+")
In [52]: df['time'] = pd.to_datetime(df['time'])
In [53]: df
Out[53]:
time source id
0 2014-04-25 A 1
1 2014-05-04 A 1
2 2014-05-05 A 1
3 2013-04-02 B 12
4 2013-04-06 B 12
5 2013-04-11 B 12
6 2013-04-12 B 12
7 2013-04-12 B 12
然后,可以在分组对象的应用调用中选择所需的行:
In [57]: g = df.groupby(['source', 'id'])
In [58]: g.apply(lambda x : x[x['time'] > (x['time'].iloc[-1] - dt.timedelta(7))])
Out[58]:
time source id
source id
A 1 1 2014-05-04 A 1
2 2014-05-05 A 1
B 12 4 2013-04-06 B 12
5 2013-04-11 B 12
6 2013-04-12 B 12
7 2013-04-12 B 12
“上周”是什么意思?仅仅是该组中的最后一个日期?不,我指的是从最后一个日期(对于一个组)开始的行的范围,它跨越一周的时间(索引)。(抱歉搞混了)不过,我还没有检查过;看起来不错。谢谢我正在运行pandas.10(不支持iloc),升级到.14,并获得pandas.algos.sure错误(float nan to int…)我必须卸载pandas,可能会尝试安装更低版本。。。尽管这看起来并不乐观。有什么建议吗?如果您无法升级或无法解决0.14的问题,您可以尝试使用
ix
而不是iloc
In [57]: g = df.groupby(['source', 'id'])
In [58]: g.apply(lambda x : x[x['time'] > (x['time'].iloc[-1] - dt.timedelta(7))])
Out[58]:
time source id
source id
A 1 1 2014-05-04 A 1
2 2014-05-05 A 1
B 12 4 2013-04-06 B 12
5 2013-04-11 B 12
6 2013-04-12 B 12
7 2013-04-12 B 12