当一个变量(列)是一个长度可变的列表时,如何交叉 pandas 数据帧

How to crosstab a pandas dataframe when one variable (column) is a list of varying length

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

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]

结果 pd.crosstab() 应该如下所示:

  X Y Z
A 3 2 1
B 3 2 1

您必须首先使用 Series.str.split then explode using 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) 

我们可以使用get_dummiesFeature2列转换为指标变量,然后将指标变量按Feature1分组并与sum

聚合
df['Factor2'].str.get_dummies('|').groupby(df['Factor1']).sum()

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