鱼C论坛

 找回密码
 立即注册
查看: 1095|回复: 6

把3列数据转换成矩阵

[复制链接]
发表于 2022-3-8 21:25:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的txt文件有3列

T1        T2        T3
a        b        1
a        c        2
a        d        3
a        e        4
b        c        5
b        d        6
b        e        7
c        d        8
c        e        9
d        e        10

想把它转换成
        a        b        c        d        e
a        0        1        2        3        4
b        1        0        5        6        7
c        2        5        0        8        9
d        3        6        8        0        10
e        4        7        9        10        0

由于数据量较大,有没有大神能用脚本实现
非常感谢
(对称矩阵较难实现的话,下面这种也可以,感谢)
        a        b        c        d        e
a        0        1        2        3        4
b                0        5        6        7
c                        0        8        9
d                                0        10
e                                        0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-9 09:58:46 | 显示全部楼层
t=[["a","b",1],["a","c",2],["a","d",3],["a","e", 4],["b","c", 5],["b","d",6],["b","e",7],["c","d", 8],["c","e",9],["d","e",10]]
s=[
    ["","a","b","c","d","e"],
    ["a",0,0,0,0,0],
    ["b",0,0,0,0,0],
    ["c",0,0,0,0,0],
    ["d",0,0,0,0,0],
    ["e",0,0,0,0,0]
]
for x in range(1,6) :
    for y in range(1,6):
        for z in t:
            if z[0]==s[x][0] and z[1]==s[0][y]:
                s[x][y]=s[y][x]=z[2]
    
for x in s:
    print(x)        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 09:59:18 | 显示全部楼层
PS D:\wp> & C:/Programs/Python/python.exe d:/wp/tx7.py
['', 'a', 'b', 'c', 'd', 'e']
['a', 0, 1, 2, 3, 4]
['b', 1, 0, 5, 6, 7]
['c', 2, 5, 0, 8, 9]
['d', 3, 6, 8, 0, 10]
['e', 4, 7, 9, 10, 0]
PS D:\wp>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 10:31:34 From FishC Mobile | 显示全部楼层
可能我的思路不是最优,希望不要介意:

思路:将字符 a, b, c .... 一一对应位置 0, 1, 2, ....
比如:dic = {'a': 0, 'b': 1, 'c': 2, ......以此类推}

矩阵:视 matrix[a][c] 如 matrix[0][2](代码写成:matrix[dic['a']][dic['c']] 便可)

假设字符很多,有 a 到 z 甚至更多,不可能一个一个慢慢写,转换思路,ord('a') 是 97,ord('z') 是 122

那么:dic = {key: value for value, key in enumerate([chr(i) for i in range(97, 123)])} 便可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 13:20:55 | 显示全部楼层
数据转置不是这样问的,况且你都说了数据量较大,而且字符也不是简单的a,b,c,d,e。
我给你一个简单的方法,excel的数据透视表。
5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 17:40:17 | 显示全部楼层
试试这样
t,c,d=[],[],[]

with open(r"test.txt",'r') as f:
    datas = f.readlines()
    for data in datas:
        data1 = data.split('        ')
        if data1 == ['\n']:
            continue
        newdata = [x.strip() for x in data1]
        c.append(newdata[0])    #收集第一列变量
        d.append(newdata[1])    #收集第二列变量
        t.append(newdata)
        
ls = c[1:] + d[1:]   #整和变量

cd = ['title'] + sorted(set(ls),key = ls.index)   #变量去重排序

array = [[0]*len(cd) for i in range(len(cd))]  

for i in range(1,len(cd)+1):
    array[i-1][0]=cd[i-1]
    array[0][i-1]=cd[i-1]

for x in range(len(array)) :
    for y in range(len(array)):
        for z in t:
            if z[0]==array[x][0] and z[1]==array[0][y]:
                array[x][y]=array[y][x]=z[2]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 19:28:03 | 显示全部楼层
提示:
1. dfp = df.pivot(...);  dfp=dfp.fillna(0)     
2. dft = dfp.T  
3. res = pd.concat([dfp, dft])  
4. 过滤+合并
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 14:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表