使用熊猫在每个PeriodIndex中选择最旧的行

时间:2019-06-27 15:55:54

标签: pandas

我有一个带有日期列的pandas DataFrame,已将其转换为基于季度的PeriodIndex:

       a    b   c   timestamp
quarter             
2018Q3  45  14  45  2018-09-04 14:15:24.168273-05:00
2018Q3* 45  14  45  2018-09-07 11:39:30.121899-05:00
2018Q4* 44  13  42  2018-12-11 10:36:19.915830-06:00
2019Q1  44  12  41  2019-03-04 08:06:57.744857-06:00
2019Q1  44  12  41  2019-03-04 08:42:03.814000-06:00
2019Q1* 44  12  41  2019-03-04 08:55:57.174777-06:00
2019Q2  44  12  41  2019-04-03 14:47:19.942471-05:00
2019Q2  44  12  41  2019-04-05 02:54:08.998211-05:00
2019Q2  44  12  41  2019-05-05 02:52:38.556931-05:00
2019Q2* 44  12  41  2019-06-03 11:36:55.218757-05:00

我想选择每个季度的最新行(上面带*的行)。

  • 我已经看过重采样,但是我不想使用 聚合函数,因为我想从另一个丢弃数据 行。我正在使用自定义套用功能进行重新采样,但是 熊猫新手,在这里进展不大。

  • 我一直在努力寻找可以进行跨行选择的逻辑 比较。

  • 我可以通过循环并保留 每个季度最古老的一排,但我是熊猫新手,所以我想 学习熊猫的方式。

以下是一些代码来生成示例DataFrame。 (我不知道如何直接使用PeriodIndex导出DataFrame-to_dict / from_dict丢失了行):

import datetime
import pandas as pd 
df_dict = {'customer_id': {5129: 123,
  2808: 123,
  2806: 123,
  5109: 123,
  5051: 123,
  2791: 123,
  5024: 123,
  3096: 123,
  4907: 123,
  6033: 123},
 'date': {5129: datetime.datetime(2019, 6, 3, 12, 17, 47, 903740, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)),
  2808: datetime.datetime(2019, 3, 4, 8, 55, 57, 174777, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-360, name=None)),
  2806: datetime.datetime(2019, 3, 4, 8, 55, 57, 174777, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-360, name=None)),
  5109: datetime.datetime(2019, 6, 3, 12, 17, 47, 903740, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)),
  5051: datetime.datetime(2019, 6, 3, 11, 43, 44, 144986, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)),
  2791: datetime.datetime(2019, 3, 4, 8, 55, 57, 174777, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-360, name=None)),
  5024: datetime.datetime(2019, 6, 3, 11, 43, 44, 144986, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)),
  3096: datetime.datetime(2018, 9, 4, 14, 15, 24, 168273, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None)),
  4907: datetime.datetime(2019, 3, 4, 8, 6, 57, 744857, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-360, name=None)),
  6033: datetime.datetime(2019, 6, 6, 9, 22, 47, 516471, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None))},
 'a': {5129: 0.0,
  2808: 140.0,
  2806: 138.0,
  5109: 0.0,
  5051: 0.0,
  2791: 0.0,
  5024: 0.0,
  3096: 0.0,
  4907: 0.0,
  6033: 0.0},
 'b': {5129: 0.0,
  2808: 0.0,
  2806: 0.0,
  5109: 16507.0,
  5051: 0.0,
  2791: 0.0,
  5024: 0.0,
  3096: 0.0,
  4907: 16498.0,
  6033: 16500.0},
 'c': {5129: 65.0,
  2808: 0.0,
  2806: 0.0,
  5109: 0.0,
  5051: 26748.0,
  2791: 26750.0,
  5024: 6.0,
  3096: 11.0,
  4907: 0.0,
  6033: 0.0}}
df = pd.DataFrame.from_dict(df_dict)
pivot = pd.pivot_table(df, index=['customer_id', 'date'], values=['a', 'b', 'c'], aggfunc='count')
for customer, data in pivot.groupby('customer_id'):
    df = data  # just grab the last one for SO example
df['timestamp'] = df.index.get_level_values('date')
df.index = pd.PeriodIndex(df.index.get_level_values('date'), freq='Q')
df

0 个答案:

没有答案