将管道分隔的平面文件导入Python以用于Pandas和统计分析

0 投票
1 回答
876 浏览
提问于 2025-04-18 08:06

我搜索了很多,但还是没有找到答案。

我想把一个平面文件里的数据导入到Python中,这样我就可以进行一些分析,比如进行t检验。

首先,我创建了一个简单的用管道符分隔的平面文件:

1|2
3|4
4|5
1|6
2|7
3|8
8|9

然后我把它保存为“simpledata”。

接着,我在nano中创建了一个bash脚本,内容是:

#!/usr/bin/env python

import sys
from scipy import stats 

A = sys.stdin.read()
print A
paired_sample = stats.ttest_rel(A[:,0],A[:,1])
print "The t-statistic is %.3f and the p-value is %.3f." % paired_sample

然后我把这个脚本保存为pairedttest.sh,并运行它,命令是:

 cat simpledata | pairedttest.sh

我遇到的错误是:

TypeError: string indices must be integers, not tuple

谢谢你们的帮助!

1 个回答

1

你是不是想调用这个?:

paired_sample = stats.ttest_rel([1,3,4,1,2,3,8], [2,4,5,6,7,8,9])

如果是这样的话,你现在的做法是不对的。A 从标准输入读取时只是一个字符串,所以你不能像现在这样去索引它。你需要从这个字符串中构建两个列表。最简单的方法是这样做:

left = []
right = []
for line in A.splitlines():
    l, r = line.split("|")
    left.append(int(l))
    right.append(int(r))
print left
print right

这样会输出:

[1, 3, 4, 1, 2, 3, 8]
[2, 4, 5, 6, 7, 8, 9]

所以你可以调用 stats.ttest_rel(left, right)

或者如果你想更聪明一点,把它写成一行(虽然几乎看不懂):

z = zip(*[map(int, line.split("|")) for line in A.splitlines()])

这样会输出:

[(1, 3, 4, 1, 2, 3, 8), (2, 4, 5, 6, 7, 8, 9)]

所以你可以调用 stats.ttest_rel(*z)

撰写回答