2017-08-03 21 views
1

私は2レベルのマルチインデックスを持つDataFrameを持っています。第1レベルのdateはDatetimeIndexであり、第2レベルのnameは一部の文字列です。データには10分間隔があります。MultiIndexされたDataFrameで1日あたりの行数をカウントするには?

このMultiIndexの最初のレベルで日付別にグループ化し、1日あたりの行数をカウントするにはどうすればよいですか?

私はマルチインデックスに結合DatetimeIndexは私も

data.groupby(data.index.levels[0].date).count() 

を書いてみました私に

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex' 

を与える

data.groupby(pd.TimeGrouper(freq='D')).count() 

をやっているので、私に問題を与えていると思われます

ValueError: Grouper and axis must be same length 

たとえば、グルーパーを長くする(つまり、重複したインデックス値を含めて、軸の長さを省略することはできます)。

ありがとうございます!

+0

が問題になっているあなたのデータフレームのサンプルを提供することができ、このグループ化操作のためのインデックスから名前を削除することができ、この

d=pd.DataFrame([['Mon','foo',3],['Tue','bar',6],['Wed','qux',9]], columns=['date','name','amount'])\ .set_index(['date','name']) 

のように見えますか? –

答えて

1

levelキーワードは、Grouperに使用できます。 (TimeGrouperは廃止予定です)。このパラメータは

ターゲットインデックスのレベルです。

例DATAFRAME:

dates = pd.date_range('2017-01', freq='10MIN', periods=1000) 
strs = ['aa'] * 1000 
df = pd.DataFrame(np.random.rand(1000,2), index=pd.MultiIndex.from_arrays((dates, strs))) 

ソリューション:

print(df.groupby(pd.Grouper(freq='D', level=0)).count()) 
       0 1 
2017-01-01 144 144 
2017-01-02 144 144 
2017-01-03 144 144 
2017-01-04 144 144 
2017-01-05 144 144 
2017-01-06 144 144 
2017-01-07 136 136 

更新:あなたはあなたの結果の数はあなたがドロップしたいゼロを持っているあなたのコメントで指摘しました。例えば、あなたのデータフレームが実際にいくつかの日が欠落していると言う:

df = df.drop(df.index[140:400]) 
print(df.groupby(pd.Grouper(freq='D', level=0)).count()) 
       0 1 
2017-01-01 140 140 
2017-01-02 0 0 
2017-01-03 32 32 
2017-01-04 144 144 
2017-01-05 144 144 
2017-01-06 144 144 
2017-01-07 136 136 

私の知る限りでは.count以内にゼロカウントを排除する方法はありません。代わりに、上記の結果を使ってゼロを削除することができます。

まずソリューションnp.nanが導入されたとき、それはfloatに変換し、int結果ので(hereから、私の意見では

res = df.groupby(pd.Grouper(freq='D', level=0)).count() 
res = res.replace(0, np.nan).dropna() 

第二に、より良い解決策、だろう、あまり好ましいかもしれない:

res = res[(res.T != 0).any()] 
print(res) # notice - excludes 2017-01-02 
       0 1 
2017-01-01 140 140 
2017-01-03 32 32 
2017-01-04 144 144 
2017-01-05 144 144 
2017-01-06 144 144 
2017-01-07 136 136 

.anyは、pandasに移植されたNumPyからのものであり、要求された軸に対していずれかの要素がTrueの場合にTrueを返します。データフレームを想定し

+0

ありがとう、ブラッド、あなたは私の質問に完全に答えました。学習の機会として、私はゼロカウントの行を取得し、 '.dropna()'を '.groupby()。count()'ステートメントに追加してもそれらが削除されないことに気付きました。 'Grouper'ドロップをゼロにする方法は、同じ行で直に数えますか? – basse

2

はあなただけ

d.reset_index('name', drop=True)\ 
.groupby('date')\ 
['amount'].count() 
関連する問題