我有一个非常希望直截了当的问题,在最近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 | +------------------------------------------+
值是值计数。有人有见识吗?谢谢!
这是重塑数据的几种方法 df
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()
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) 或者,groupby在over上'Col X','Col Y'使用,然后填充零。unstack``Col Y``NaNs
groupby
'Col X','Col Y'
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
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
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