在 pandas DataFrame 中为列中的每个类别创建单独的交叉表
Create separate crosstab in pandas DataFrame for each category in a column
我有一个 pandas DataFrame df
看起来像这样(示例):
df = pd.DataFrame({'Time' : ['Low','High','Medium','Low','Low','High','Low','High','Medium'],
'Sentiment' : ['Pos','Neg','Neg','Pos','Pos','Neg','Neg','Pos','Neg'],
'Product' : ['P1','P1','P1','P2','P1','P2','P2','P2','P1']})
我的问题很简单(我在发布前搜索过),我需要创建一个 crosstab
,可以使用以下命令轻松创建:
pd.crosstab(df['Time'],df['Sentiment'])
并给出所需的输出:
Sentiment Neg Pos
Time
High 2 1
Low 1 3
Medium 2 0
现在数据中多了一列名为 Product
的列,其中包含大约 50 个唯一类别(示例中我包含了 2 个),我需要为所有类别创建类似的 crosstab
对象,我该怎么做?
我的预期输出如下所示:
Crosstab
对于 Product1 (P1):
P1
Sentiment Neg Pos
Time
High 1 0
Low 0 2
Medium 2 0
Crosstab
产品 1 (P2):
P2
Sentiment Neg Pos
Time
High 1 1
Low 1 1
Medium 0 0
如何一次性获得50个crosstab
?
对两列的列表使用 crosstab
- 所以得到 MultiIndex
:
df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment'])
print (df1)
Sentiment Neg Pos
Product Time
P1 High 1 0
Low 0 2
Medium 2 0
P2 High 1 1
Low 1 1
要在 MultiIndex
中添加所有可能的值,请添加 DataFrame.unstack
and DataFrame.stack
:
df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment']).unstack(fill_value=0).stack()
print (df1)
Sentiment Neg Pos
Product Time
P1 High 1 0
Low 0 2
Medium 2 0
P2 High 1 1
Low 1 1
Medium 0 0
然后 select 第一级 DataFrame.loc
:
print (df1.loc['P1'])
Sentiment Neg Pos
Time
High 1 0
Low 0 2
Medium 2 0
print (df1.loc['P2'])
Sentiment Neg Pos
Time
High 1 1
Low 1 1
我有一个 pandas DataFrame df
看起来像这样(示例):
df = pd.DataFrame({'Time' : ['Low','High','Medium','Low','Low','High','Low','High','Medium'],
'Sentiment' : ['Pos','Neg','Neg','Pos','Pos','Neg','Neg','Pos','Neg'],
'Product' : ['P1','P1','P1','P2','P1','P2','P2','P2','P1']})
我的问题很简单(我在发布前搜索过),我需要创建一个 crosstab
,可以使用以下命令轻松创建:
pd.crosstab(df['Time'],df['Sentiment'])
并给出所需的输出:
Sentiment Neg Pos
Time
High 2 1
Low 1 3
Medium 2 0
现在数据中多了一列名为 Product
的列,其中包含大约 50 个唯一类别(示例中我包含了 2 个),我需要为所有类别创建类似的 crosstab
对象,我该怎么做?
我的预期输出如下所示:
Crosstab
对于 Product1 (P1):
P1
Sentiment Neg Pos
Time
High 1 0
Low 0 2
Medium 2 0
Crosstab
产品 1 (P2):
P2
Sentiment Neg Pos
Time
High 1 1
Low 1 1
Medium 0 0
如何一次性获得50个crosstab
?
对两列的列表使用 crosstab
- 所以得到 MultiIndex
:
df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment'])
print (df1)
Sentiment Neg Pos
Product Time
P1 High 1 0
Low 0 2
Medium 2 0
P2 High 1 1
Low 1 1
要在 MultiIndex
中添加所有可能的值,请添加 DataFrame.unstack
and DataFrame.stack
:
df1 = pd.crosstab([df['Product'], df['Time']],df['Sentiment']).unstack(fill_value=0).stack()
print (df1)
Sentiment Neg Pos
Product Time
P1 High 1 0
Low 0 2
Medium 2 0
P2 High 1 1
Low 1 1
Medium 0 0
然后 select 第一级 DataFrame.loc
:
print (df1.loc['P1'])
Sentiment Neg Pos
Time
High 1 0
Low 0 2
Medium 2 0
print (df1.loc['P2'])
Sentiment Neg Pos
Time
High 1 1
Low 1 1