当一个变量(列)是不同长度的列表时,如何交叉制表 pandas 数据框

str*_*tum 3 python crosstab pandas

如何从以下数据帧生成交叉表:

import pandas as pd
dat = pd.read_csv('data.txt', sep=',')
dat.head(6)

  Factor1 Factor2
0       A       X
1       B       X
2       A     X|Y
3       B     X|Y
4       A   X|Y|Z
5       B   X|Y|Z

dat[['Factor2']] = dat[['Factor2']].applymap(lambda x : x.split('|'))
dat.head(6)

  Factor1    Factor2
0       A        [X]
1       B        [X]
2       A     [X, Y]
3       B     [X, Y]
4       A  [X, Y, Z]
5       B  [X, Y, Z]
Run Code Online (Sandbox Code Playgroud)

结果pd.crosstab()应该是这样的:

  X Y Z
A 3 2 1
B 3 2 1
Run Code Online (Sandbox Code Playgroud)

Ch3*_*teR 5

您必须首先|使用 using进行拆分Series.str.split,然后使用 进行爆炸DataFrame.explode

df['Factor2'] = df['Factor2'].str.split('|')
t = df.explode('Factor2')
pd.crosstab(t['Factor1'], t['Factor2'])

# Factor2  X  Y  Z
# Factor1         
# A        3  2  1
# B        3  2  1

# to remove the axis names.
# pd.crosstab(t['Factor1'], t['Factor2']).rename_axis(index=None, columns=None) 
Run Code Online (Sandbox Code Playgroud)


Shu*_*rma 5

我们可以使用get_dummies将列转换Feature2为指示变量,然后将指示变量分组Feature1并聚合sum

df['Factor2'].str.get_dummies('|').groupby(df['Factor1']).sum()
Run Code Online (Sandbox Code Playgroud)
         X  Y  Z
Factor1         
A        3  2  1
B        3  2  1
Run Code Online (Sandbox Code Playgroud)