2017-04-13 75 views
0

我有一個這樣的數據框。python中兩個變量的表函數

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

我想每個c_name與每個p_name的頻率。 我用

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

但是在Python中得到適當的輸出R如果我申請 pd.crosstab(df1['c_name'],df1['p_name'])它給結果,但格式不正確。

我的期望是:提前

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,如果需要還遺漏值增加reindex0替換它們:

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