我有一个数据帧,前5行是:
indexed.head(5)
>>>>
SOURCE_SYSTEM TRADE_ID
endtime
2013-09-12 15:04:44 SystemA PXXX86883150911
2013-09-12 17:25:07 SystemB PXXX66048140211
2013-09-12 17:25:07 SystemY PYYY66049140211
2013-09-12 17:25:08 SystemZ PZZZ34553220311
2013-09-12 17:25:09 SystemZ PAAA76226310311
nb,索引是一个日期时间列。
我想生成两件事:
i)按月(或其他一段时间)的结果计数
ii)按期间分割的结果计数和第二列值(即数据?)
我已经能够通过首先创建一个Period对象来实现第一个:
prng = pd.period_range(indexed.index.min(), indexed.index.max(),freq='M')
然后迭代,在此过程中执行一种查找:
for r in prng:
print ( str(r), len(indexed[str(r)]) )
返回:
2013-09 8
2013-10 2
2013-11 4
2013-12 1069
2014-01 2242
2014-02 1338
2014-03 2567
2014-04 762
2014-05 1028
2014-06 1885
2014-07 4303
2014-08 879
2014-09 399
2014-10 6002
2014-11 622
2014-12 625
这就是我想要的东西。) 问题是,有更简单的方法吗?那我的第二部分ii)也许有一个使用groupby和/或pivot的方法?我已经阅读了关于这些的文档,但我不知何故错过了这一点。有什么建议吗?
答案 0 :(得分:4)
您可以使用df.resample
轻松完成(i),如下所示
import pandas as pd
from random import choice
N = 1024
dt = pd.date_range('1/1/2011', periods=N, freq='3H')
A = [choice('ABCD') for _ in range(N)]
B = [choice('WXYZ') for _ in range(N)]
df = pd.DataFrame(data={'A':A, 'B':B}, index=dt)
# A B
# 2011-01-01 00:00:00 B Z
# 2011-01-01 03:00:00 A X
# 2011-01-01 06:00:00 B Y
# 2011-01-01 09:00:00 D W
# 2011-01-01 12:00:00 A Z
# ...
resampled = df.resample('M', how='count')
# A B
#2011-01-31 248 248
#2011-02-28 224 224
#2011-03-31 248 248
#2011-04-30 240 240
#2011-05-31 64 64
对于(ii),您可以使用pd.pivot_table
,一旦您创建了一个month
列,其中包含您可以使用的年份。
df['month'] = ['{}-{}'.format(y, m) for y, m in zip(df.index.year, df.index.month)]
pivot = pd.pivot_table(df, values='B', index='month', columns='A', aggfunc='count')
#A A B C D
#month
#2011-1 64 58 67 59
#2011-2 62 52 47 63
#2011-3 70 58 59 61
#2011-4 52 63 64 61
#2011-5 16 19 15 14