【问题标题】:Pandas: group with TimeGrouperPandas:使用 TimeGrouper 分组
【发布时间】:2016-10-14 08:03:42
【问题描述】:

我有数据

i,ID,url,used_at,active_seconds,domain,search_term  
322015,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/antoninaribina,2015-12-31 09:16:05,35,vk.com,None    
838267,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed,2015-12-31 09:16:38,54,vk.com,None  
838271,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed?section=photos,2015-12-31 09:17:32,34,vk.com,None   
322026,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed?section=photos&z=photo143297356_397216312%2Ffeed1_143297356_1451504298,2015-12-31 09:18:06,4,vk.com,None    
838275,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed?section=photos,2015-12-31 09:18:10,4,vk.com,None    
322028,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed?section=comments,2015-12-31 09:18:14,8,vk.com,None  
322029,0120bc30e78ba5582617a9f3d6dfd8ca,megarand.ru/contest/121070,2015-12-31 09:18:22,16,megarand.ru,None  
1870917,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/feed?section=comments,2015-12-31 09:18:38,6,vk.com,None 
1354612,0120bc30e78ba5582617a9f3d6dfd8ca,vk.com/antoninaribina,2015-12-31 09:18:44,56,vk.com,None   

我需要按ID 分组,然后按used_at 分组,其中两个字符串之间的差异大于500 second。 我试试

df.groupby([df['ID', 'used_at'],pd.TimeGrouper(freq='5Min')])

但它返回KeyError: ('ID', 'used_at')

【问题讨论】:

  • 你可以试试df.groupby([df[['ID', 'used_at']],pd.TimeGrouper(freq='5Min')]) 你需要传递一个字符串列表,你试图传递的实际上是一个元组,因此是keyerror
  • @EdChum ValueError: Grouper for '<class 'pandas.core.frame.DataFrame'>' not 1-dimensional
  • df.groupby([df[['ID', 'used_at'],pd.TimeGrouper(freq='5Min')]) 工作吗?
  • @EdChum 它返回TypeError: unhashable type: 'list'

标签: python pandas


【解决方案1】:

您需要的 IIUC:

print (df.groupby('ID')['used_at'].diff().dt.seconds)
0     NaN
1    33.0
2    54.0
3    34.0
4     4.0
5     4.0
6     8.0
7    16.0
8     6.0
Name: used_at, dtype: float64

如果你想使用TimeGrouper,你应该首先设置一个Datetimeindex,然后你可以使用任何聚合函数——例如。 sum:

df['used_at'] = pd.to_datetime(df.used_at)
df.set_index('used_at', inplace=True)
print (df.groupby([df['ID'],pd.TimeGrouper(freq='5Min')]).sum())

另一种方法是将列used_at复制到index

df['used_at'] = pd.to_datetime(df.used_at)
df.set_index(df['used_at'], inplace=True)
print (df.groupby([df['ID'], df['used_at'],pd.TimeGrouper(freq='5Min')]).sum())

【讨论】:

  • 带有TimeGrouper的代码返回TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
  • 种子编辑,可能需要将string列转换为datetime
  • 谢谢!玩具可以看到我的另一个问题。请stackoverflow.com/questions/38269617/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
相关资源
最近更新 更多