如何在给定 3 列的情况下创建正方形 dataframe/matrix - Python
How to create a square dataframe/matrix given 3 columns - Python
我正在努力弄清楚如何在给定
这样的格式的情况下开发方阵
a a 0
a b 3
a c 4
a d 12
b a 3
b b 0
b c 2
...
类似于:
a b c d e
a 0 3 4 12 ...
b 3 0 2 7 ...
c 4 3 0 .. .
d 12 ...
e . ..
在 pandas 中。我开发了一种我认为可行但永远需要 运行 的方法,因为每次使用 for 循环时,它都必须从头开始遍历每个值的每一列和每一行。我觉得我绝对是在这里重新发明轮子。鉴于有多少列和行,这对于我的数据集也不现实。 python 中是否有类似于 R 的 cast 函数的东西可以更快地完成此操作?
你可以使用 df.pivot
:
import pandas as pd
df = pd.DataFrame([['a', 'a', 0],
['a', 'b', 3],
['a', 'c', 4],
['a', 'd', 12],
['b', 'a', 3],
['b', 'b', 0],
['b', 'c', 2]], columns=['X','Y','Z'])
print(df.pivot(index='X', columns='Y', values='Z'))
产量
Y a b c d
X
a 0.0 3.0 4.0 12.0
b 3.0 0.0 2.0 NaN
这里,index='X'
告诉df.pivot
使用标记为'X'
的列作为索引,columns='Y'
告诉它使用标记为'Y'
的列作为列索引。
有关 pivot
和其他重塑方法的更多信息,请参阅 the docs。
或者,您可以使用 pd.crosstab
:
print(pd.crosstab(index=df.iloc[:,0], columns=df.iloc[:,1],
values=df.iloc[:,2], aggfunc='sum'))
与期望每个 (a1, a2)
对都是唯一的 df.pivot
不同,pd.crosstab
(with agfunc='sum'
) 将通过对关联的求和来聚合重复对
值。尽管您发布的示例中没有重复对,但指定
当 values
时,需要如何聚合重复项
使用参数。
此外,虽然 df.pivot
传递了列标签,但 pd.crosstab
传递了
类数组(例如 df
的整列)。 df.iloc[:, i]
是第 i
列
df
.
我正在努力弄清楚如何在给定
这样的格式的情况下开发方阵a a 0
a b 3
a c 4
a d 12
b a 3
b b 0
b c 2
...
类似于:
a b c d e
a 0 3 4 12 ...
b 3 0 2 7 ...
c 4 3 0 .. .
d 12 ...
e . ..
在 pandas 中。我开发了一种我认为可行但永远需要 运行 的方法,因为每次使用 for 循环时,它都必须从头开始遍历每个值的每一列和每一行。我觉得我绝对是在这里重新发明轮子。鉴于有多少列和行,这对于我的数据集也不现实。 python 中是否有类似于 R 的 cast 函数的东西可以更快地完成此操作?
你可以使用 df.pivot
:
import pandas as pd
df = pd.DataFrame([['a', 'a', 0],
['a', 'b', 3],
['a', 'c', 4],
['a', 'd', 12],
['b', 'a', 3],
['b', 'b', 0],
['b', 'c', 2]], columns=['X','Y','Z'])
print(df.pivot(index='X', columns='Y', values='Z'))
产量
Y a b c d
X
a 0.0 3.0 4.0 12.0
b 3.0 0.0 2.0 NaN
这里,index='X'
告诉df.pivot
使用标记为'X'
的列作为索引,columns='Y'
告诉它使用标记为'Y'
的列作为列索引。
有关 pivot
和其他重塑方法的更多信息,请参阅 the docs。
或者,您可以使用 pd.crosstab
:
print(pd.crosstab(index=df.iloc[:,0], columns=df.iloc[:,1],
values=df.iloc[:,2], aggfunc='sum'))
与期望每个 (a1, a2)
对都是唯一的 df.pivot
不同,pd.crosstab
(with agfunc='sum'
) 将通过对关联的求和来聚合重复对
值。尽管您发布的示例中没有重复对,但指定
当 values
时,需要如何聚合重复项
使用参数。
此外,虽然 df.pivot
传递了列标签,但 pd.crosstab
传递了
类数组(例如 df
的整列)。 df.iloc[:, i]
是第 i
列
df
.