2017-10-13 6 views
0

データピボットテーブルの種類を作成したいと思います。オカレンスの行をピボットする方法

Animal Count Year 
0 dog  1 2015 
1 cat  0 2015 
2 dog  0 2016 
3 cat  2 2016 
4 dog  2 2017 
5 cat  3 2017 

DF決勝

Animal  Date Occurence 
0 dog 2017-01-10   2 
1 cat 2017-03-06   3 
2 dog 2015-02-03   1 
3 cat 2016-04-05   2 

私は、データフレームのピボット方法を見てきましたが、それは私が出現列で数を乗算することはできません。

私がこれまで持っているだけコード:

import pandas as pd 
import numpy as np 
from datetime import datetime 

df = pd.DataFrame({ 
     'Date': [datetime(2017,1,10), datetime(2017,3,6), 
       datetime(2015,2,3), datetime(2016,4,5)], 
     'Occurence': [2,3,1,2], 
     'Animal': ['dog','cat','dog','cat']}) 

それを行うのパンダの方法はありますか? + unstack + stack

+1

ようこそStackOverflow。質の高い質問をしてくれてありがとう。未来のために、質問にのみ質問してください。あなたはあなたの不足している権限について不平を言うことは誰にも利益をもたらさず、特にあなたはその質問に対して適切な答えを得ていません。編集が既にキューに入れられているので心配することはありません。良い一日を! (From Review https://stackoverflow.com/review/first-posts/17614773) – LW001

+0

私は以前、このような非常に政治的な問題のために「疫病のような」スタックオーバーフローを避けました。それは通常私のニーズに適していません。残念なことに、パンダは、私が感じるサポートを提供する代替手段を提供するのを忘れてしまった。 –

答えて

0

使用set_index

df1 = (df.set_index([df['Date'].rename('Year').dt.year,'Animal'])['Occurence'] 
     .unstack(fill_value=0) 
     .stack() 
     .reset_index(name='count')) 
print (df1) 

    Year Animal count 
0 2015 cat  0 
1 2015 dog  1 
2 2016 cat  2 
3 2016 dog  0 
4 2017 cat  3 
5 2017 dog  2 

または使用reindex

mux = pd.MultiIndex.from_product([pd.unique(df['Animal']), 
            pd.unique(df['Date'].dt.year)], names=('Animal','Year')) 

df1 = (df.set_index(['Animal', df['Date'].dt.year])['Occurence'] 
     .reindex(mux, fill_value=0) 
     .reset_index(name='count')) 
print (df1) 
    Animal Year count 
0 dog 2017  2 
1 dog 2015  1 
2 dog 2016  0 
3 cat 2017  3 
4 cat 2015  0 
5 cat 2016  2 

EDIT:

Animalの列Yearでペアが重複し、上記の解決策がある場合は失敗しました:

を 0必要集約 -
df1 = (df.set_index([df['Date'].rename('Year').dt.year,'Animal'])['Occurence'] 
     .unstack(fill_value=0) 
     .stack() 
     .reset_index(name='count')) 
print (df1) 

ValueError: Index contains duplicate entries, cannot reshape

だから、あなたはユニークなペアを必要とします。最速はsumのような集計機能付きgroupby次のとおりです。

print (df.groupby(['Date', 'Animal'])['Occurence'].sum()) 
Date  Animal 
2015-02-03 dog  1 
2016-04-05 cat  5 
2017-01-10 dog  2 
2017-03-06 cat  3 
Name: Occurence, dtype: int64 

ます。また、日付時刻と集計から年を抽出することができます

df2 = df.groupby([df['Date'].rename('Year').dt.year, 'Animal'])['Occurence'].sum() 
print (df2) 
Year Animal 
2015 dog  1 
2016 cat  5 
2017 cat  3 
     dog  2 
Name: Occurence, dtype: int64 

次に、上記Animalの使用溶液ですべての組み合わせYearのためのゼロを埋めるために:

df3 = df2.unstack(fill_value=0).stack().reset_index(name='count') 
print (df3) 
    Year Animal count 
0 2015 cat  0 
1 2015 dog  1 
2 2016 cat  5 
3 2016 dog  0 
4 2017 cat  3 
5 2017 dog  2 

mux = pd.MultiIndex.from_product([pd.unique(df['Date'].dt.year), 
            pd.unique(df['Animal'])], names=('Year','Animal')) 

df4 = df2.reindex(mux, fill_value=0).reset_index(name='count') 
print (df4) 
    Year Animal count 
0 2017 dog  2 
1 2017 cat  3 
2 2015 dog  1 
3 2015 cat  0 
4 2016 dog  0 
5 2016 cat  5 
+1

'pd.unique(df ['Animal'])'はdf ['Animal']と同じです。ユニーク() ' – Zero

+0

何かがここで正しく見えません。 1つの行に複数のインスタンスを指定する「オカレンス」行を説明するために、そこに「sum()」があるべきではありませんか?なぜこの作品が私のためにそれを分解することができますか? –

+0

編集した回答を確認してください。 – jezrael

関連する問題