2015-09-15 53 views
10

カテゴリ値(0または1)を持つ複数の列を持つPandas DataFrameを使用すると、同時にすべての列のvalue_countsを便利に取得できますか?私は便利なすべての列の値のカウントを取得するにはどうすればよいPandas DataFrameで複数の列の値を一度に取得する方法は?

a b c d 
0 0 1 1 0 
1 1 1 1 1 
2 1 1 1 0 
3 0 1 0 0 
4 0 0 0 1 
5 0 1 1 0 
6 0 1 1 1 
7 1 0 1 0 
8 1 0 1 1 
9 0 1 1 0 

をして取得:

import numpy as np 
import pandas as pd 
np.random.seed(0) 
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd')) 

私はこのようなデータフレームを取得することができます。たとえば

は、次のように私はデータフレームを生成すると仮定します次は便利ですか?

a b c d 
0 6 3 2 6 
1 4 7 8 4 

私の現在のソリューションは、次のとおりです。

pieces = [] 
for col in df.columns: 
    tmp_series = df[col].value_counts() 
    tmp_series.name = col 
    pieces.append(tmp_series) 
df_value_counts = pd.concat(pieces, axis=1) 

しかしそこピボット、スタッキングのような、単純な方法であること、またはGROUPBYしなければなりませんか?

+0

[以下この回答を](https://stackoverflow.com/a/47187144/3707607は) 'pd.crosstab'と異なるアプローチを提供します。また、 'value_counts'はトップレベルの関数で、現在選択されている解答を' df.apply(pd.value_counts) 'に簡約することができます –

答えて

22

だけapplyを呼び出し、pd.Series.value_countsを渡す:crosstabmelt

df = pd.DataFrame({'a': ['table', 'chair', 'chair', 'lamp', 'bed'], 
        'b': ['lamp', 'candle', 'chair', 'lamp', 'bed'], 
        'c': ['mirror', 'mirror', 'mirror', 'mirror', 'mirror']}) 

df 

     a  b  c 
0 table lamp mirror 
1 chair candle mirror 
2 chair chair mirror 
3 lamp lamp mirror 
4 bed  bed mirror 

でこの問題をやって、かなり面白いと高度な方法は、実際にあり

In [212]: 
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd')) 
df.apply(pd.Series.value_counts) 

Out[212]: 
    a b c d 
0 4 6 4 3 
1 6 4 6 7 
+1

どうしたらいいですか?ブリリアント! – Xin

+0

変数が同じ範囲にない場合、存在しない値はNaN値(明らかに)として表示されます。人々を見て! – VishnuVardhanA

+0

いくつかの選択された列にこれを使用する方法はありますか? – deadcode

3

我々は最初のデータフレーム

を溶かすことができます
df1 = df.melt() 
df1 

    columns index 
0  a table 
1  a chair 
2  a chair 
3  a lamp 
4  a  bed 
5  b lamp 
6  b candle 
7  b chair 
8  b lamp 
9  b  bed 
10  c mirror 
11  c mirror 
12  c mirror 
13  c mirror 
14  c mirror 

次に、クロスタブ関数を使用して各列の値を数えます。これは、現在選択されている答えのためのケースではないでしょうint型としてデータ型を保持する:

pd.crosstab(index=df['index'], columns=df['columns']) 

columns a b c 
index   
bed  1 1 0 
candle 0 1 0 
chair 2 1 0 
lamp  1 2 0 
mirror 0 0 5 
table 1 0 0 

それとも**でパラメータ名に列名を展開する1行、(これは高度である)

pd.crosstab(**df.melt(var_name='columns', value_name='index')) 

はまた、value_countsは現在、トップレベルの関数です。ですから、以下に現在選択されている答えを簡素化することができます。

df.apply(pd.value_counts) 
関連する問題