从 python 制作矩阵格式
Making a matrix-format from 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.concat
、wow
和 wow.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
您可以将 '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
您可以将列 F1
和 F2
分类并使用 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
备注:在构造DataFrame时指定列数据类型更高效
我的数据框 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.concat
、wow
和 wow.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
您可以将 '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
您可以将列 F1
和 F2
分类并使用 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
备注:在构造DataFrame时指定列数据类型更高效