从python中生成矩阵格式



我的数据帧B中有以下数据:

F1     F2    Count
A      C      5
B      C      2
B      U      6
C      A      1

我想把它们做成一个正方形矩阵,这样结果会是:

A    B   C  U
A   0    0   6  0
B   0    0   2  6
C   6    2   0  0
U   0    6   0  0

我最初使用pd.crosstab(),但矩阵中缺少F1/F2中的一些变量。

AC=5 CA=1,因此输出应该是6。

此外,pdcrosstab((无法识别BU = UB

有谁能帮忙吗?我基本上是python的新手。

顺便说一句,这是我的代码:

wow=pd.crosstab(B.F1, 
B.F2, 
values=B.Count, 
aggfunc='sum',
).rename_axis(None).rename_axis(None, axis=1)

您可以pd.concatwowwow.T,然后groupby索引和sum

>>> wow=pd.crosstab(B.F1, 
B.F2, 
values=B.Count, 
aggfunc='sum',
).rename_axis(None).rename_axis(None, axis=1)
>>> wow
A    C    U
A  NaN  5.0  NaN
B  NaN  2.0  6.0
C  1.0  NaN  NaN
>>> pd.concat([wow, wow.T], sort=True).fillna(0, downcast='infer').groupby(level=0).sum()
A  B  C  U
A  0  0  6  0
B  0  0  2  6
C  6  2  0  0
U  0  6  0  0

您可以将列F1F2分类,并将crosstab用于工作。

FDtype = pd.CategoricalDtype(list("ABCU"))
df[["F1", "F2"]] = df[["F1", "F2"]].astype(FDtype)
count = pd.crosstab(df["F1"], df["F2"], df["Count"], aggfunc='sum', dropna=False)
count.fillna(0, inplace=True, downcast="infer")
count += count.T

备注:在构造数据帧时,指定列数据类型更有效

您可以将'F1''F2'交换的DataFrame附加到原始DataFrame。

df1 = df.append(df.rename({'F1': 'F2', 'F2': 'F1'}, axis=1), sort=False)

然后您可以使用pivot_table:

pd.pivot_table(df1, values='Count', index='F1', columns='F2', aggfunc='sum', fill_value=0)

crosstab:

pd.crosstab(df1.F1, df1.F2, df1.Count, aggfunc='sum').fillna(0)

最后删除列和索引名称:

del df1.columns.name, df1.index.name

结果:

A  B  C  U
A  0  0  6  0
B  0  0  2  6
C  6  2  0  0
U  0  6  0  0

最新更新