2017-04-13 40 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