我有一个两列的dataframe,其中每一行代表一对。
import pandas as pd
x = pd.DataFrame([['dog', 'cat'], ['fish', 'parrot'], ['dog', 'llama'], ['pig', 'sloth']])
我的目标是将它转换成一个方阵,其中索引和列标头都用原始dataframe的惟一值填充,如下所示:
使用这个有用的答案,我可以做一个基于这些值的矩阵: df6 = x。pivot_table(index=0, columns=1, values=1, aggfunc='size', fill_value=0) 这不是我想要的,因为它不是正方形的(某些值,如'dog ',在索引中出现,但在列中省略)。 我改变了上面的手动输入项目的列和行: df7 = df6。重建索引(指数=[“猫”,“鱼”,“猪”、“骆驼”、“鹦鹉”,“懒惰”),列=[“猫”,“鱼”,“猪”、“骆驼”、“鹦鹉”,“懒惰”],fill_value = 0) 再说一次,这不是我想要的,因为构造它很费时间。所以我尝试添加一行来得到唯一的值列表:
listOfItems = pd.unique(df.values.ravel('K')
这不起作用,因为它给出的是0和1,而不是字符串值。所以我尝试用下面的方法来获得标题和列的唯一值:
listOfColumns = df6.columns
listOfIndex = df6.index
joinedlist = listOfColumns + listOfIndex
但我得到一个错误消息:操作数不能与形状(4,)(3,)一起广播 谁有好的方法来做方阵? 问题来源StackOverflow 地址:/questions/59380534/how-do-you-make-a-square-matrix-from-two-columns-of-pairs
我在熊猫方面没有什么经验,所以我相信有人会带来一些漂亮的熊猫命令来转换数据,如你所愿。
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。