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中)中的解决方案?