2017-04-13 4 views
0

私はこのようなデータフレームを持っています。Pythonの2つの変数のテーブル関数

c_name  p_name  
    A   X 
    B   Y 
    B   A1 
    C   ZX 
    D   G4 
    D   H9 

各p_nameにはそれぞれのc_nameの頻度が必要です。 私はそれが適切な形式で結果を与えていないが、 pd.crosstab(df1['c_name'],df1['p_name'])を適用していた場合

data.frame(table(df1$c_name,df1$p_name)) 

しかし、Pythonでを使用してRでの適切な出力を取得しています。

私の予想は以下のとおりです。事前に

c_name  p_name Freq 
    A   X  1 
    B   X  0 
    B   X  0 
    C   X  0 
    D   X  0 
    D   X  0 
    A   Y  0 
    B   Y  1 
    B   Y  0 
    C   Y  0 
    D   Y  0 
    D   Y  0 ..........so on. 

感謝。

+0

クロス集計は、あなたが望むものはおそらくないグループ、あたりの周波数を与えるべきではありません。あなたは** pandas.Series.value_counts **を試しましたか? – noumenal

+0

[単一変数の頻度表]の複製が可能です(http://stackoverflow.com/questions/12207326/frequency-table-for-a-single-variable) – noumenal

+0

RのソリューションPythonで)? – jogo

答えて

1
pd.crosstab(df['c_name'], df['p_name']).stack().reset_index(name='Freq') 

これが得られます:

c_name p_name Freq 
0  A  A1  0 
1  A  G4  0 
2  A  H9  0 
3  A  X  1 
4  A  Y  0 
5  A  ZX  0 
6  B  A1  1 
7  B  G4  0 
8  B  H9  0 
9  B  X  0 
10  B  Y  1 
11  B  ZX  0 
12  C  A1  0 
13  C  G4  0 
14  C  H9  0 
15  C  X  0 
16  C  Y  0 
17  C  ZX  1 
18  D  A1  0 
19  D  G4  1 
20  D  H9  1 
21  D  X  0 
22  D  Y  0 
23  D  ZX  0 
+0

ありがとうございました。 – tom

0

ソリューションgroupbysizeと、必要性にも欠けている値はreindexを追加し、0に置き換える場合:

mux = pd.MultiIndex.from_product([df1['c_name'], df1['p_name']], names=['c_name','p_name']) 
df1 = df1.groupby(['c_name','p_name']).size() 
     .reindex(mux, fill_value=0).reset_index(name='Freq') 

print (df1) 
    c_name p_name Freq 
0  A  X  1 
1  A  Y  0 
2  A  A1  0 
3  A  ZX  0 
4  A  G4  0 
5  A  H9  0 
6  B  X  0 
7  B  Y  1 
8  B  A1  1 
9  B  ZX  0 
10  B  G4  0 
11  B  H9  0 
12  B  X  0 
13  B  Y  1 
14  B  A1  1 
15  B  ZX  0 
16  B  G4  0 
17  B  H9  0 
18  C  X  0 
19  C  Y  0 
20  C  A1  0 
21  C  ZX  1 
22  C  G4  0 
23  C  H9  0 
24  D  X  0 
25  D  Y  0 
26  D  A1  0 
27  D  ZX  0 
28  D  G4  1 
29  D  H9  1 
30  D  X  0 
31  D  Y  0 
32  D  A1  0 
33  D  ZX  0 
34  D  G4  1 
35  D  H9  1 

タイミング

ソリューションが速くなる、stack何のために:

In [197]: %timeit pd.crosstab(df1['c_name'], df1['p_name']).stack().reset_index(name='Freq') 
100 loops, best of 3: 6.74 ms per loop 

In [198]: %timeit df1.groupby(['c_name','p_name']).size().reindex(pd.MultiIndex.from_product([df1['c_name'], df1['p_name']], names=['c_name','p_name']), fill_value=0).reset_index(name='Freq') 
100 loops, best of 3: 3.12 ms per loop