当一个变量(列)是一个长度可变的列表时,如何交叉 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_dummies
将Feature2
列转换为指标变量,然后将指标变量按Feature1
分组并与sum
聚合
df['Factor2'].str.get_dummies('|').groupby(df['Factor1']).sum()
X Y Z
Factor1
A 3 2 1
B 3 2 1
如何从以下数据帧生成交叉 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_dummies
将Feature2
列转换为指标变量,然后将指标变量按Feature1
分组并与sum
df['Factor2'].str.get_dummies('|').groupby(df['Factor1']).sum()
X Y Z
Factor1
A 3 2 1
B 3 2 1