python中两个变量的表函数

python中两个变量的表函数,python,pandas,Python,Pandas,我有一个这样的数据框 c_name p_name A X B Y B A1 C ZX D G4 D H9 我想要每个c_名称和每个p_名称的频率。 通过使用 data.frame(table(df1$c_name,df1$p_name)) 但在python中,如果我正在应用 pd.crosstab(df1['c_name'],df1

我有一个这样的数据框

c_name      p_name    
  A           X
  B           Y
  B           A1
  C           ZX
  D           G4
  D           H9
我想要每个c_名称和每个p_名称的频率。 通过使用

data.frame(table(df1$c_name,df1$p_name))
但在python中,如果我正在应用
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.
提前谢谢

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
这将提供:

   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

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')

计时

解决方案更快,因为没有
堆栈

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
带有和
大小的解决方案
,如果需要还缺少值,则添加并替换为
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')

计时

解决方案更快,因为没有
堆栈

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

交叉列表应该给出每组的频率,这可能不是您想要的。您是否尝试过pandas.Series.value_counts?可能重复的?您是否也在寻找R(或仅在Python中)中的解决方案?交叉列表应为您提供每组的频率,这可能不是您想要的。您是否尝试过pandas.Series.value_counts?可能的重复?您是否也在寻找R(或仅在Python中)中的解决方案?