【问题标题】:Pandas DataFrame groupby two columns and get first and lastPandas DataFrame 按两列分组并获得第一个和最后一个
【发布时间】:2014-03-11 13:37:38
【问题描述】:

我有一个DataFrame 喜欢关注。

df = pd.DataFrame({'id' : [1,1,2,3,2],
                'value'  : ["a","b","a","a","c"], 'Time' : ['6/Nov/2012 23:59:59 -0600','6/Nov/2012 00:00:05 -0600','7/Nov/2012 00:00:09 -0600','27/Nov/2012 00:00:13 -0600','27/Nov/2012 00:00:17 -0600']})

我需要得到如下输出。

combined_id | enter time | exit time | time difference

combined_id 应该通过分组 'id' 和 'value' 来创建

g = df.groupby(['id', 'value'])

以下不适用于按两列分组。 (这里如何使用first()last()作为进出时间?)

df['enter'] = g.apply(lambda x: x.first())

要获得差异会遵循以下工作吗?

df['delta'] = (df['exit']-df['enter'].shift()).fillna(0)

【问题讨论】:

  • 我想我已经回答了这个问题,如果没有,您能否提供所需的输出? :)
  • @Andy Hayden : 不是这个 :)

标签: python pandas dataframe


【解决方案1】:

首先确保您的列是正确的日期时间列:

In [11]: df['Time'] = pd.to_datetime(df['Time'])

现在,您可以通过 firstlast groupby 方法执行 groupby 并使用 agg:

In [12]: g = df.groupby(['id', 'value'])

In [13]: res = g['Time'].agg({'first': 'first', 'last': 'last'})

In [14]: res = g['Time'].agg({'enter': 'first', 'exit': 'last'})

In [15]: res['time_diff'] = res['exit'] - res['enter']

In [16]: res
Out[16]:
                        exit               enter  time_diff
id value
1  a     2012-11-06 23:59:59 2012-11-06 23:59:59     0 days
   b     2012-11-06 00:00:05 2012-11-06 00:00:05     0 days
2  a     2012-11-07 00:00:09 2012-11-07 00:00:09     0 days
   c     2012-11-27 00:00:17 2012-11-27 00:00:17     0 days
3  a     2012-11-27 00:00:13 2012-11-27 00:00:13     0 days

注意:这是一个有点无聊的例子,因为每个组中只有一个项目...

【讨论】:

  • 嗨,安迪,再次感谢您。
猜你喜欢
  • 2017-10-17
  • 2020-07-26
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多