python - 将二维列表更改为标准矩阵形式
问题描述
org = [['A', 'a', 1],
['A', 'b', 2],
['A', 'c', 3],
['B', 'a', 4],
['B', 'b', 5],
['B', 'c', 6],
['C', 'a', 7],
['C', 'b', 8],
['C', 'c', 9]]
我想将“组织”更改为标准矩阵形式,如下所示。
transform = [['\t','A', 'B', 'C'],
['a', 1, 4, 7],
['b', 2, 5, 8],
['c', 3, 6, 9]]
我做了一个小函数来转换它。我写的代码如下:
import numpy as np
def matrix(li):
column = ['\t']
row = []
result = []
rest = []
for i in li:
if i[0] not in column:
column.append(i[0])
if i[1] not in row:
row.append(i[1])
result.append(column)
for i in li:
for r in row:
if r == i[1]:
rest.append([i[2]])
rest = np.array(rest).reshape((len(row),len(column)-1)).tolist()
for i in range(len(rest)):
rest[i] = [row[i]]+rest[i]
result += rest
for i in result:
print(i)
matrix(org)
结果是这样的:
>>>['\t', 'school', 'kids', 'really']
[72, 0.008962252017017516, 0.04770759762717251, 0.08993156334317577]
[224, 0.004180594204995023, 0.04450803342634945, 0.04195010047081213]
[385, 0.0021807662921382335, 0.023217182598008267, 0.06564858527712682]
我不认为这是有效的,因为我使用了这么多for
循环。有没有有效的方法来做到这一点?
解决方案
由于您使用的是 3rd 方库,因此这项任务非常适合pandas
.
根据您的要求合并索引和列有一些混乱但并非低效的工作。
org = [['A', 'a', 1],
['A', 'b', 2],
['A', 'c', 3],
['B', 'a', 4],
['B', 'b', 5],
['B', 'c', 6],
['C', 'a', 7],
['C', 'b', 8],
['C', 'c', 9]]
df = pd.DataFrame(org)
pvt = df.pivot_table(index=0, columns=1, values=2)
cols = ['\t'] + pvt.columns.tolist()
res = pvt.values.T.tolist()
res.insert(0, pvt.index.tolist())
res = [[i]+j for i, j in zip(cols, res)]
print(res)
[['\t', 'A', 'B', 'C'],
['a', 1, 4, 7],
['b', 2, 5, 8],
['c', 3, 6, 9]]
推荐阅读
- yii2 - 为什么模型的公共功能中的规则不能正确完成其工作?
- javascript - 在 Cloud Firestore 中返回文档
- unity3d - 向另一个方向旋转统一游戏对象
- azure - 部署到 Azure 服务结构时无法访问 Spring Boot 端口
- python - Shopify API JSON Feed / Limit 250 和 Pages / GET 每次不是下一页时都会提取完全相同的记录
- java - Arrays.sort() 对于相同输入的 int[] 和 String 的工作方式不同,为什么?
- c++ - D3DLVERTEX中关于Tu和Tv的C++参数
- database - 如何连接多个数据库用户名randonly
- php - MySQL获取/超过两个日期变量之间的记录
- python-3.x - 将数据从网页提取到 CSV 文件,仅保存最后一行