Pandas 的数据透视表或分组依据?
Posted
技术标签:
【中文标题】Pandas 的数据透视表或分组依据?【英文标题】:Pivot Tables or Group By for 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 |
+------------------------------------------+
其中的值是值计数。有人有任何见识吗?谢谢!
【问题讨论】:
【参考方案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 X
、columns=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_index
与unstack
一起使用
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_index
和unstack
)通常不起作用:当原始数据中有重复行时它会失败。以上是关于Pandas 的数据透视表或分组依据?的主要内容,如果未能解决你的问题,请参考以下文章