【发布时间】:2010-10-28 15:23:46
【问题描述】:
我有一组数据(CSV 文件),格式为以下 3 列:
A, B, C
3277,4733,54.1
3278,4741,51.0
3278,4750,28.4
3278,4768,36.0
3278,4776,50.1
3278,4784,51.4
3279,4792,82.6
3279,4806,78.2
3279,4814,36.4
我需要得到一个三向列联表,例如:(抱歉,这看起来不太好)
A /B 4733 4741 4750 4768 4776 4784 4792 4806 4814
3277 C 54.1
3278 51 28.4 36 50.1 51.4
3279 82.6 78.2 36.4
类似于 excel“数据透视表”、OpenOffice 数据试点或 R“table(x,y,z)”
问题是我的数据集非常庞大(总行数超过 500,000 行,在 A 和 B 中大约有 400 个不同的因素。(OOo、MSO 和 R 限制阻止了实现这一点)
我确信可以使用 Python 脚本来创建这样的表。 A 和 B 都是数字(但可以视为字符串)。
有人处理过这个吗? (也欢迎使用 C 或 Java 中的伪代码或代码……但我更喜欢 python,因为它实现起来更快:)
编辑: 几乎拥有它,感谢 John Machin。以下 Python 脚本 几乎 提供了我正在寻找的内容,但是,在编写输出文件时,我可以看到我正在编写的“标题”中的值(取自第一行)不对应到其他行。
from collections import defaultdict as dd
d = dd(lambda: dd(float))
input = open("input.txt")
output = open("output.txt","w")
while 1:
line = input.readline()
if not line:
break
line = line.strip('\n').strip('\r')
splitLine = line.split(',')
if (len(splitLine) <3):
break
d[splitLine[0]][splitLine[1]] = splitLine[2]
output.write("\t")
for k,v in d.items()[0][1].items():
output.write(str(k)+"\t")
output.write("\n")
for k,v in d.items():
output.write(k+"\t")
for k2,v2 in v.items():
output.write(str(v2)+"\t")
output.write("\n")
【问题讨论】:
-
考虑使用 numpy 数组,它针对更大的数据集进行了优化scipy.org/…
-
我无法看到这个问题的三方面性质。你的表不是 Z[A,B] = C 的 Z 吗?如果 A 和 B 有 400 个因子,那么 Z 只有 400*400。您是否对相同的 A、B 对进行平均?我在这里缺少第三个维度。很像道路杀手。
-
是的,抱歉我的描述有误。我只需要将 3 列表映射到行/列/值表。理想情况下,我需要一个带有 A、B、C 的 CSV 文件的脚本,并以所示的表格格式写入相同的数据。
-
所以你的输出矩阵是真正的 3D 矩阵,如 Z[A,B,C],没有存储在 Z[A,B,C] 中的值,它只是存在吗?还是不清楚。告诉我们你想用这个做什么可能会更容易,然后我们可以找到更好的解决方案。显然你不想打印出来......
-
嗯...实际上进行转换的想法是以这种特定方式“呈现”数据。将 A、B、C 视为一个图,其中 A 和 B 是两个节点,C 是节点之间弧的“标签”。这个想法是以矩阵的形式呈现数据。
标签: python r algorithm scripting import-from-csv