簡體   English   中英

使用索引元組值作為數據幀的行和列名稱將Pandas groupby.groups結果轉換為數據幀

[英]Converting Pandas groupby.groups result into dataframe, using index tuple value as row and columns name of dataframe

我的groupby.groups的結果返回:

{(2014, 36): [2], (2014, 41): [3, 4], (2013, 10): [0], (2014, 48): [5], (2014, 37): [1]}

我想將其轉換為如下所示的數據框:

      2013 2014
10    1    0
36    0    1
37    0    1
41    0    2
48    0    1 

-添加-這是我的工作流程到groupby.groups結果中:

def tr_epoch(epoch):
       y,wn,dn = epoch.isocalendar()
       return y, wn

d = [1362826800, 1410260400, 1409828400, 1412766000, 1412769600, 1417262400 ] 
l = map(lambda x:  tr_epoch(datetime.datetime.fromtimestamp(x)), d)
df = pd.DataFrame(l, columns=['year','week_idx'])
res = df.groupby(['year','week_idx']).groups

-以pythonic方式添加-使用迭代,我會做:

def  to_dict(k,v):
    yr, wk = k
    return {'week': wk, yr: len(v)}

data =  map(lambda(k,v): to_dict(k,v), res.iteritems())
df = pd.DataFrame.from_records(data, index='week').fillna(0).sort()

但我敢肯定,有一種熊貓方法。

因此,您要計算每個組的大小? 然后,您可以執行以下操作:

In [31]: df.groupby(['year','week_idx']).size()
Out[31]:
year  week_idx
2013  10          1
2014  36          1
      37          1
      41          2
      48          1
dtype: int64

為了將其重塑為預期的輸出,我們現在可以使用unstack將“年”索引級別從行移動到列(並使用fillna來獲取0):

In [33]: df.groupby(['year','week_idx']).size().unstack(0).fillna(0)
Out[33]:
year      2013  2014
week_idx
10           1     0
36           0     1
37           0     1
41           0     2
48           0     1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM