首页 > 解决方案 > 你如何从两列对组成一个方阵?

问题描述

我有一个两列数据框,其中每一行代表一对。

import pandas as pd
x = pd.DataFrame([['dog', 'cat'], ['fish', 'parrot'], ['dog', 'llama'], ['pig', 'sloth']])

我的目标是将其转换为方阵,其中索引和列标题都填充了原始数据帧的唯一值,如下所示:

在此处输入图像描述

在这里使用有用的答案,我可以根据值制作一个矩阵:

df6 = x.pivot_table(index=0, columns=1, values=1, aggfunc='size', fill_value=0)

这不是我想要的,因为它不是方形的(某些值,如“狗”,存在于索引中,但从列中省略)。

我将上面的内容更改为手动输入列和行的项目:

df7 = df6.reindex(index=["cat","fish","pig","llama","parrot","sloth"], columns=["cat","fish","pig","llama","parrot","sloth"], fill_value=0)

同样,这不是我想要的,因为构建起来很耗时。所以我尝试添加一行来获取唯一的值列表:

listOfItems = pd.unique(df.values.ravel('K')

这不起作用,因为它给了我 0 和 1,而不是字符串值。所以我尝试使用以下方法获取标题和列的唯一值:

listOfColumns = df6.columns
listOfIndex = df6.index
joinedlist = listOfColumns + listOfIndex

但我收到一条错误消息:operands could not be broadcast together with shapes (4,) (3,)

有没有人有制作方阵的好方法?

标签: python

解决方案


我在 pandas 方面的经验很少,所以我相信有人会用一些漂亮的 pandas 命令来按照你的意愿转换数据,但与此同时,我想玩这个并想出了下面的代码。

import pandas as pd
pairs = [['dog', 'cat'], ['fish', 'parrot'], ['dog', 'llama'], ['pig', 'sloth']]
x = pd.DataFrame(pairs)

names = sorted(set([name for name in [*x[0], *x[1]]]))
data = [[0]*len(names) for _ in range(len(names))]
y = pd.DataFrame(data=data, columns=names, index=names)
for pair in pairs:
    y[pair[1]][pair[0]] = 1

print(y)

输出

        cat  dog  fish  llama  parrot  pig  sloth
cat       0    0     0      0       0    0      0
dog       1    0     0      1       0    0      0
fish      0    0     0      0       1    0      0
llama     0    0     0      0       0    0      0
parrot    0    0     0      0       0    0      0
pig       0    0     0      0       0    0      1
sloth     0    0     0      0       0    0      0

推荐阅读