Python 从两列中选择数据透视表,值为其中一列的计数

Python 从两列中选择数据透视表,值为其中一列的计数,python,pandas,pivot,Python,Pandas,Pivot,我有一个数据框: +---------------+-------------+ | Test_Category | Test_Result | +---------------+-------------+ | Cat_1 | Pass | | Cat_1 | N/A | | Cat_2 | Fail | | Cat_2 | Fail | | Cat_3 |

我有一个数据框:

+---------------+-------------+
| Test_Category | Test_Result |
+---------------+-------------+
| Cat_1         | Pass        |
| Cat_1         | N/A         |
| Cat_2         | Fail        |
| Cat_2         | Fail        |
| Cat_3         | Pass        |
| Cat_3         | Pass        |
| Cat_3         | Fail        |
| Cat_3         | N/A         |
+---------------+-------------+
我需要一张这样的桌子:

+------+------+------+-----+
|      | Pass | Fail | N/A |
+------+------+------+-----+
| Cat1 |    1 |      |   1 |
| Cat2 |      |    2 |     |
| Cat3 |    2 |    1 |   1 |
+------+------+------+-----+
我尝试使用Pivot,但不知道如何让它从Test_Result列中计算出现次数,并将它们作为值放入Pivot Result


谢谢大家!

这里有一个问题
NaN
值被排除在外,因此必须使用:

或与一起使用,用于重塑:

df['Test_Result'] = df['Test_Result'].fillna('n/a')

df1 = df.groupby(['Test_Category','Test_Result']).size().unstack()
print (df1)
Test_Result    Fail  Pass  n/a
Test_Category                 
Cat_1           NaN   1.0  1.0
Cat_2           2.0   NaN  NaN
Cat_3           1.0   2.0  1.0

另一个解决方案包括:


您可以使用两列中的唯一值作为索引和列,并使用pandas的
iterrows()

输出

       Pass  nan  Fail
Cat1     1    1     0
Cat2     0    0     2
Cat3     2    1     1

尽管使用
groupby()
肯定会更快。

谢谢。有.fill('N/A')的解决方案对我有效,其他没有该部分的解决方案在结果数据框中只返回两列“Fail”和“Pass”。尝试使用“N/A”和“NA”值,默认情况下,这些值似乎被忽略。
df1 = df.groupby(['Test_Category','Test_Result']).size().unstack(fill_value=0)
print (df1)
Test_Result    Fail  Pass  n/a
Test_Category                 
Cat_1             0     1    1
Cat_2             2     0    0
Cat_3             1     2    1
df = df.pivot_table(index='Test_Category',columns='Test_Result', aggfunc='size')
df_out = pd.DataFrame(index=df['Test_Category'].unique().tolist(), columns=df['Test_Result'].unique().tolist())

for index, row in df_out.iterrows():
    for col in df_out.columns:
        df_out.loc[index, col] = len(df[(df['Test_Category'] == index) & (df['Test_Result'] == col)])
       Pass  nan  Fail
Cat1     1    1     0
Cat2     0    0     2
Cat3     2    1     1