python - 你如何从两列对组成一个方阵?
问题描述
我有一个两列数据框,其中每一行代表一对。
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,)
有没有人有制作方阵的好方法?
解决方案
我在 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
推荐阅读
- c# - C# xml 序列化结构改变
- javascript - 努力理解这些功能是如何工作的
- odoo - ODOO -12 通知设置
- c# - .NET Core MVC 在 iframe (IronPDF) 中显示 PDF
- azure - Azure Front Door 在重定向中保留自定义 URL
- c - 如何从 C 变量中的 txt 文件中解析表?
- node.js - AES-192 的 IV 长度无效
- reactjs - 如何在 componentDidUpdate 中设置状态?
- sql - 如何在查询 Laravel 7 中执行此操作?
- azure - Intune 在 Windows 10 Azure AD 连接设备上提取 ADMX 并启用客户端自动更新