Ste*_*ish 22 python group-by pivot-table count pandas
我有一个希望直截了当的问题,在过去3个小时里给我带来了很多困难.应该很容易.
这是挑战.
我有一个pandas数据帧:
+--------------------------+
| Col 'X' Col 'Y' |
+--------------------------+
| class 1 cat 1 |
| class 2 cat 1 |
| class 3 cat 2 |
| class 2 cat 3 |
+--------------------------+
Run Code Online (Sandbox Code Playgroud)
我想要将数据帧转换为:
+------------------------------------------+
| cat 1 cat 2 cat 3 |
+------------------------------------------+
| class 1 1 0 0 |
| class 2 1 0 1 |
| class 3 0 1 0 |
+------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
其中值是值计数.有人有任何见解吗?谢谢!
Zer*_*ero 53
以下是重塑数据的几种方法 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
2)或者,使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)