【问题标题】:Pivot Tables or Group By for Pandas?Pandas 的数据透视表或分组依据?
【发布时间】:2015-08-21 04:01:30
【问题描述】:

我有一个希望直截了当的问题,在过去的 3 个小时里给我带来了很多困难。这应该很容易。

挑战来了。

我有一个熊猫数据框:

+--------------------------+
|     Col 'X'    Col 'Y'  |
+--------------------------+
|     class 1      cat 1  |
|     class 2      cat 1  |
|     class 3      cat 2  |
|     class 2      cat 3  |
+--------------------------+

我希望将数据框转换为:

+------------------------------------------+
|                  cat 1    cat 2    cat 3 |
+------------------------------------------+
|     class 1         1        0        0  |
|     class 2         1        0        1  |
|     class 3         0        1        0  |
+------------------------------------------+

其中的值是值计数。有人有任何见识吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

    这里有几种重塑数据的方法df

    In [27]: df
    Out[27]:
         Col X  Col Y
    0  class 1  cat 1
    1  class 2  cat 1
    2  class 3  cat 2
    3  class 2  cat 3
    

    1) 使用pd.crosstab()

    In [28]: pd.crosstab(df['Col X'], df['Col Y'])
    Out[28]:
    Col Y    cat 1  cat 2  cat 3
    Col X
    class 1      1      0      0
    class 2      1      0      1
    class 3      0      1      0
    

    2) 或者,在'Col X','Col Y' 上使用groupby,在unstack 上使用Col Y,然后用零填充NaNs

    In [29]: df.groupby(['Col X','Col Y']).size().unstack('Col Y', fill_value=0)
    Out[29]:
    Col Y    cat 1  cat 2  cat 3
    Col X
    class 1      1      0      0
    class 2      1      0      1
    class 3      0      1      0
    

    3) 或者,将pd.pivot_table()index=Col Xcolumns=Col Y 一起使用

    In [30]: pd.pivot_table(df, index=['Col X'], columns=['Col Y'], aggfunc=len, fill_value=0)
    Out[30]:
    Col Y    cat 1  cat 2  cat 3
    Col X
    class 1      1      0      0
    class 2      1      0      1
    class 3      0      1      0
    

    4) 或者,将set_indexunstack 一起使用

    In [492]: df.assign(v=1).set_index(['Col X', 'Col Y'])['v'].unstack(fill_value=0)
    Out[492]:
    Col Y    cat 1  cat 2  cat 3
    Col X
    class 1      1      0      0
    class 2      1      0      1
    class 3      0      1      0
    

    【讨论】:

    • 感谢 John - 这非常有帮助,尤其是提供了不同的可能性!我什至没有想到交叉表的可能性。
    • 感谢三者的比较。我默认是groupby,经常看到用pivot_table。
    • 遇到这个是因为我试图弄清楚 groupby 和 pivot_table 之间的区别以及何时使用哪个。你的回答肯定是有帮助的。您是否知道有关不同概念的易于理解的信息?欢呼
    • 警告:最后一种方法(set_indexunstack)通常不起作用:当原始数据中有重复行时它会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2021-03-28
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多