首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫分组经营

熊猫分组经营
EN

Stack Overflow用户
提问于 2020-11-09 17:04:10
回答 2查看 47关注 0票数 1

我有这样的数据

代码语言:javascript
复制
df = pd.DataFrame({'id': [205,205,205, 211, 211, 211]
                  , 'date': pd.to_datetime(['2019-12-01','2020-01-01', '2020-02-01'
                                           ,'2019-12-01' ,'2020-01-01', '2020-03-01'])})
df

    id  date
0   205 2019-12-01
1   205 2020-01-01
2   205 2020-02-01
3   211 2019-12-01
4   211 2020-01-01
5   211 2020-03-01

其中,列date是为id 205连续几个月生成的,而对于id 211则不是。

我只想保留(**id**)的观测值,因为我有每月的数据,没有跳转。在这个例子中,需要:

代码语言:javascript
复制
    id  date
0   205 2019-12-01
1   205 2020-01-01
2   205 2020-02-01

在这里,我收集id以保存:

代码语言:javascript
复制
keep_id = []
for num in pd.unique(df.index):
    temp = (df.loc[df['id']==num,'date'].dt.year - df.loc[df['id']==num,'date'].shift(1).dt.year) * 12 + df.loc[df['id']==num,'date'].dt.month - df.loc[df['id']==num,'date'].shift(1).dt.month
    temp.values[0] = 1.0 # here I correct the first entry
    if (temp==1.).all():
        keep_id.append(num)

在这里,我使用(df.loc[num,'date'].dt.year - df.loc[num,'date'].shift(1).dt.year) * 12 + df.loc[num,'date'].dt.month - df.loc[num,'date'].shift(1).dt.month来计算每个id与前一个date的几个月之间的差异。

当在一小部分df上测试时,这似乎是可行的,但我确信有一种更好的方法可以做到这一点,也许可以使用.groupby()方法。

由于df 是由数以百万计的观察组成的,所以我的代码花费了太多的时间(我想学习一种更高效、更仿生的方法)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-09 17:28:39

您想要做的是使用groupby而不是groupby。

代码语言:javascript
复制
df.groupby('id').filter(lambda x: not (x.date.diff() > pd.Timedelta(days=32)).any())

准确地提供:

代码语言:javascript
复制
    id       date
0  205 2019-12-01
1  205 2020-01-01
2  205 2020-02-01

事实上,我会保持指数的独特性,有太多有用的特征需要保留。

在输出方面,这种反应和Michael的上述都是正确的。就性能而言,它们也非常相似:

代码语言:javascript
复制
%timeit df.groupby('id').filter(lambda x: not (x.date.diff() > pd.Timedelta(days=32)).any())
1.48 ms ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

代码语言:javascript
复制
%timeit df[df.groupby('id')['date'].transform(lambda x: x.diff().max() < pd.Timedelta(days=32))]
1.7 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于大多数操作来说,这种差异是可以忽略不计的。

票数 2
EN

Stack Overflow用户

发布于 2020-11-09 17:29:19

您可以使用以下方法。在我的测试中只快了3倍。

代码语言:javascript
复制
df[df.groupby('id')['date'].transform(lambda x: x.diff().max() < pd.Timedelta(days=32))]

退出:

代码语言:javascript
复制
          date
id            
205 2019-12-01
205 2020-01-01
205 2020-02-01
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64756014

复制
相关文章

相似问题

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