【问题标题】:Get index of where group starts and ends pandas获取组开始和结束 pandas 的索引
【发布时间】:2018-07-11 14:08:36
【问题描述】:

我按月对数据进行分组。现在我需要知道我的小组从哪个观察/索引开始和结束。 我得到的是以下输出,其中第二列表示每个月的观察次数:

date
01       145
02      2232
03     12785
04     16720
Name: date, dtype: int64

使用此代码:

leave.groupby([leave['date'].dt.strftime('%m')])['date'].count()

我想要的是一个以后可以访问的索引范围。不知何故(格式并不重要,我不介意它返回列表还是数据框)

date
01       0 - 145
02      146 - 2378
03     2378 - 15163
04     15164 - 31884

【问题讨论】:

  • 您想要每个组的最小和最大索引吗?
  • 是的,(这样我以后可以访问它以循环索引)
  • 好的,我想我明白了
  • 这个问题将受益于reproducible example

标签: python pandas date indexing grouping


【解决方案1】:

尝试以下操作 - 使用 shift

df['data'] = df['data'].shift(1).add(1).fillna(0).apply(int).apply(str) + ' - ' + df['data'].apply(str)

输出:

     data
date    
1    0 - 145
2    146 - 2232
3    2233 - 12785
4    12786 - 16720
5    16721 - 30386
6    30387 - 120157

【讨论】:

  • 你忘了加1
  • 点赞df['data'].shift(1).fillna(0).add(1).apply(int).apply(str)
  • 您可以使用字符串格式避免intstr,并使用.cat 而不是+ - 例如:df.date.shift(1).fillna(0).add(1).apply('{:.0f}'.format).str.cat(df.date.astype(str), sep=' - ')
【解决方案2】:

我认为您要的是一个数据框,其中包含每个值的第一次和最后一次出现的索引。

这样的事情怎么样。

示例数据(注意——最好在您的问题中包含可重现的数据,这样我就不必猜测了):

import pandas as pd
import numpy as np

np.random.seed(123)
n = 500
df = pd.DataFrame(
        {'date':pd.to_datetime(
                  pd.DataFrame( { 'year':  np.random.choice(range(2017,2019), size=n),
                                  'month': np.random.choice(range(1,13),      size=n),
                                  'day':   np.random.choice(range(1,28),      size=n)
                                 } )
         ) }  
    )

方法:

pd.DataFrame( ( { '_month_':x,'firstIndex':y[0],'lastIndex':y[-1]} 
                for x, y in df.index.groupby(df['date'].dt.month).items() 
               )
             )

结果:

    _month_  firstIndex  lastIndex
0         1           0        495
1         2          21        499
2         3           1        488
3         4           5        498
4         5          14        492
5         6          12        470
6         7          15        489
7         8           2        494
8         9          18        475
9        10           3        491
10       11          10        473
11       12           7        497

如果您仅将其用于循环索引,则不必将其包装在 pd.DataFrame() 中——您可以将其保留为生成器。

【讨论】:

  • 这正是我想要的。但不幸的是,它不起作用。我正在处理日期,所以我分组的列是日期列。我收到以下错误:TypeError:'Series' 对象是可变的,因此它们不能被散列。 leave.sort_values(by='date', inplace=True) pd.DataFrame( ( { 'group':x,'firstIndex':y[0],'lastIndex':y[-1]} for x, y in leave.index.groupby([leave['date'].dt.strftime('%m')])['date'].items() ) )
  • @LN_P 而不是.groupby([leave['date'].dt.strftime('%m')])['date'].items(),试试.groupby([leave['date'].dt.month.items()。无需使用 strftime 并且不确定您在使用那里的 date 列做什么。我会更新我的答案。
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多