首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用id对列进行重采样

如何用id对列进行重采样
EN

Stack Overflow用户
提问于 2019-04-07 20:31:24
回答 2查看 1.2K关注 0票数 5

我有这样的数据集:

代码语言:javascript
复制
id    date    value

1   16-12-1     9
1   16-12-1     8
1   17-1-1      18
2   17-3-4      19
2   17-3-4      20
1   17-4-3      21
2   17-7-13     12
3   17-8-9      12
2   17-9-12     11
1   17-11-12    19
3   17-11-12    21

上面唯一的结构是按日期对行进行排序。

我想要做的是,按id分组并重采样日期,这样每个id都有相同的数字值。每月、每周或每天重新抽样就足够了。

我的最后数据集(在年度重采样时)如下所示:

代码语言:javascript
复制
id    interval           value

1   16-12-1 - 17-12-1     75
2   16-12-1 - 17-12-1     62
3   16-12-1 - 17-12-1     33

如何实现这一点?这是否有效(因为我在日期字段中没有秒,也就是说,它不是标准的熊猫日期时间对象)?

代码语言:javascript
复制
dataframe.groupby(id).resample('year')

有什么更快的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-07 21:28:10

按身份证分列的每周金额:

代码语言:javascript
复制
df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df.groupby('id').resample('W')['value'].agg('sum').loc[lambda x: x>0]

输出:

代码语言:javascript
复制
id  date      
1   2016-12-04    17
    2017-01-01    18
    2017-04-09    21
    2017-11-12    19
2   2017-03-05    39
    2017-07-16    12
    2017-09-17    11
3   2017-08-13    12
    2017-11-12    21
Name: value, dtype: int64
票数 3
EN

Stack Overflow用户

发布于 2019-04-07 21:11:44

更新尝试(带重采样)

生成数据

代码语言:javascript
复制
d = [['id', 'date', 'value'],
    [1, '2016-12-1', 9],
    [1, '2016-12-1',8],
    [1, '2017-1-1',18],
    [2, '2017-3-4',19],
    [2, '2017-3-4',20],
    [1,'2017-4-3',21],
    [2, '2017-7-13',12],
    [3, '2017-8-9',12],
    [2, '2017-9-12',11],
    [1, '2017-11-12',19],
    [3, '2017-11-12',21],]
df = pd.DataFrame(d[1:], columns=d[0])

print(df)
    id        date  value
0    1   2016-12-1      9
1    1   2016-12-1      8
2    1    2017-1-1     18
3    2    2017-3-4     19
4    2    2017-3-4     20
5    1    2017-4-3     21
6    2   2017-7-13     12
7    3    2017-8-9     12
8    2   2017-9-12     11
9    1  2017-11-12     19
10   3  2017-11-12     21

每年重新抽样,后加和

代码语言:javascript
复制
df.index = pd.to_datetime(df.date)
df.drop('date',axis = 1, inplace = True)
df_g = df.groupby('id').resample('y').sum()
df_g.drop(columns=['id'], inplace=True)

print(df_g)
               value
id date             
1  2016-12-31     17
   2017-12-31     58
2  2017-12-31     62
3  2017-12-31     33

初始答案(不需要重新抽样)

您可以这样做,但它不执行显式的resample操作。

代码语言:javascript
复制
f = {'date':['min','max'],
    'value':'sum'}
df_grouped = df.groupby(['id']).agg(f)
df_grouped.columns = ['_'.join(col) for col in df_grouped.columns.values]
df_grouped.reset_index(drop=False, inplace=True)

print(df_grouped)
   id  date_min date_max  value_sum
0   1   16-12-1   17-4-3         75
1   2    17-3-4  17-9-12         62
2   3  17-11-12   17-8-9         33
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55563411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档