【问题标题】:Pandas dataframe to count matrix熊猫数据框来计算矩阵
【发布时间】:2017-04-11 22:01:27
【问题描述】:

这一定很明显,但我找不到简单的解决方案。

我有这样的熊猫数据框:

actual | predicted
------ + ---------
Apple  | Apple
Apple  | Apple
Apple  | Banana
Banana | Orange
Orange | Apple

我想要这个:

       |  Apple  | Banana  | Orange
------ + ------- + ------- + -------
Apple  |  2      | 1       | 0
Banana |  0      | 0       | 1
Orange |  1      | 0       | 0

【问题讨论】:

    标签: python pandas group-by pivot-table crosstab


    【解决方案1】:

    有点摸不着头脑,但我认为您正在寻找confusion matrix

    from sklearn.metrics import confusion_matrix
    print confusion_matrix(df['actual'], df['predicted'])
    

    【讨论】:

      【解决方案2】:

      您可以使用pandas.pivot_table

      >>> df.pivot_table(index='actual', columns='predicted', aggfunc=len).fillna(0).astype('int')
      predicted Apple Banana Orange
      actual                       
      Apple         2      1      0
      Banana        0      0      1
      Orange        1      0      0
      

      【讨论】:

        【解决方案3】:

        您可以使用groupby 聚合size 和unstack MultiIndex:

        df = df.groupby(['actual','predicted']).size().unstack(fill_value=0)
        print (df)
        predicted  Apple  Banana  Orange
        actual                          
        Apple          2       1       0
        Banana         0       0       1
        Orange         1       0       0
        

        crosstab 的另一种解决方案:

        df = pd.crosstab(df.actual, df.predicted)
        print (df)
        predicted  Apple  Banana  Orange
        actual                          
        Apple          2       1       0
        Banana         0       0       1
        Orange         1       0       0
        

        【讨论】:

        • 接受crosstab。取消堆叠 size() 对我来说似乎有点像 hack。
        • 感谢您的采纳!第一个解决方案更快,但我同意它有点 hack。
        • In [142]: %timeit pd.crosstab(df.actual, df.predicted) 100 loops, best of 3: 5.04 ms per loop 和 In [143]: %timeit df.groupby(['actual','predicted']).size().unstack(fill_value=0) 1000 loops, best of 3: 1.28 ms per loop
        • @GregorSturm 根本不是黑客。您正在计算您看到每个组合的次数。要获取矩阵,您需要取消堆叠并用零填充空值。我敢肯定,如果您深入了解crosstab,您会看到很多相同的东西。
        • +1 用于涉及groupby() 的第一个解决方案,因为它允许我执行sum() 而不是size(),而crosstab() 解决方案则不行。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2020-12-15
        • 2019-07-09
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 2014-02-16
        • 2020-05-10
        • 2015-01-28
        相关资源
        最近更新 更多