我正在努力弄清楚如何使用像
这样的格式来开发方阵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&#39的强制转换功能,可以更快地完成这项工作?
答案 0 :(得分:8)
您可以使用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'))
与期望每个df.pivot
对唯一的(a1, a2)
不同,pd.crosstab
(使用agfunc='sum'
)将通过对相关联的求和来聚合重复对
值。虽然您发布的示例中没有重复对,但请指定
values
时需要如何聚合重复项
使用参数。
此外,虽然df.pivot
传递了列标签,但传递了pd.crosstab
数组 - 喜欢(例如df
的整列)。 df.iloc[:, i]
是i
列
df
。