Python 对a'重新采样;整洁';熊猫数据帧
我有两列感兴趣的时间戳数据:“标签”和计数。我想创建一个时间序列,每个标签每一天的总和。我可以使用Python 对a'重新采样;整洁';熊猫数据帧,python,pandas,Python,Pandas,我有两列感兴趣的时间戳数据:“标签”和计数。我想创建一个时间序列,每个标签每一天的总和。我可以使用重采样来实现这一点吗 具体例子: import pandas as pd import numpy as np from itertools import cycle idx = pd.date_range('2016-01-01', '2016-01-07', freq='H') n = np.random.randint(10, size=24*6+1) lst = [(l,c) for l,
重采样
来实现这一点吗
具体例子:
import pandas as pd
import numpy as np
from itertools import cycle
idx = pd.date_range('2016-01-01', '2016-01-07', freq='H')
n = np.random.randint(10, size=24*6+1)
lst = [(l,c) for l,c in zip(cycle(['foo', 'bar']), n)]
df = pd.DataFrame(lst, index=idx, columns=['label', 'n'])
df.resample(???).sum()
对于本例,目标数据帧应包含一个时间索引和两列(foo
和bar
),其中包含每个间隔的总计数。我认为您需要:
另一种使用日期时间索引的解决方案:
print (df.set_index('label', append=True)
.unstack(1)
.resample('1D')
.sum()
.stack()
.reset_index()
.rename(columns={'level_0':'date'}))
date label n
0 2016-01-01 bar 44.0
1 2016-01-01 foo 40.0
2 2016-01-02 bar 60.0
3 2016-01-02 foo 69.0
4 2016-01-03 bar 65.0
5 2016-01-03 foo 58.0
6 2016-01-04 bar 51.0
7 2016-01-04 foo 55.0
8 2016-01-05 bar 37.0
9 2016-01-05 foo 67.0
10 2016-01-06 bar 59.0
11 2016-01-06 foo 59.0
12 2016-01-07 foo 5.0
如果需要两列:
df1 = df.set_index('label', append=True).unstack(1).resample('1D').sum()
df1.columns = df1.columns.droplevel(0)
print (df1)
label bar foo
2016-01-01 61.0 65.0
2016-01-02 54.0 56.0
2016-01-03 70.0 53.0
2016-01-04 46.0 49.0
2016-01-05 61.0 49.0
2016-01-06 50.0 55.0
2016-01-07 NaN 6.0
我没想到能将重采样
与groupby
链接起来,非常强大。作为补充说明,我想出了第三种方法,使用TimeGrouper:df.groupby([pd.TimeGrouper('W'),'label'])
。
df1 = df.set_index('label', append=True).unstack(1).resample('1D').sum()
df1.columns = df1.columns.droplevel(0)
print (df1)
label bar foo
2016-01-01 61.0 65.0
2016-01-02 54.0 56.0
2016-01-03 70.0 53.0
2016-01-04 46.0 49.0
2016-01-05 61.0 49.0
2016-01-06 50.0 55.0
2016-01-07 NaN 6.0