比较列名,然后比较Python中的行数据

时间:2017-08-14 17:16:37

标签: python csv

所以我想要做的是我有一个看起来像这样的csv文件:

"test_name", "Mean", "Median", "Std_Dev"
"Data Name 1", 50, 75, 10
"Data Name 2", 52, 80, 11
"Data Name 1", 53, 79, 9 
"Data Name 2", 55, 78, 8
"Data Name 3", 54, 77, 7
"Data Name 3", 53, 71, 7
"Data Name 1", 51, 72, 8

现在,我有一个程序可以查找测试名称是否相互相等。因为如果它们具有相同的数据名称,我想比较它们拥有的数据。

import csv

csvfile = 'some.csv'

data = {}

with open('some.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        for (k,v) in row.items():
                try:
                        data[k].append(v)
                except KeyError:
                        data[k] = [v]

testNames = data['test_name']
mean = data['Mean']
median = data['Median']
std = data['Stdev']

for val in testNames:
        for val2 in testNames:
                if val == val2:
                    index = testNames.index(val)
                    index2 = testNames.index(val2)

                    medianTemp = median[index]
                    medianTemp2 = median[index2]

                    if medianTemp2 > medianTemp:
                            sub = medianTemp2 - medianTemp
                            if sub > 100:
                                    print "Uh oh! @ ", val, "and ", val2 names only

也许,我在这里做了一些遥远的事情。我只是想比较具有相同测试名称的数据的中位数。在我已经比较了test_names之后,我正在努力获得行数据比较。我有那个部分在工作。

*******编辑********* 我正在尝试使用index()来查找元素位置。

现在我遇到的问题是索引和index2是完全相同的值。而不是数据名1给出索引0而下一个数据名1给出索引2为2.它们都给出0.

非常感谢任何建议。

谢谢:)

2 个答案:

答案 0 :(得分:1)

您可以遍历testNames的索引,然后使用索引访问行数据

for i in range(len(testNames)):
    for j in range(len(testNames)):
        if i != j and testNames[i] == testNames[j]:
            # access row data using: data['Median'][i] data['Median'][j] 

答案 1 :(得分:0)

虽然这可能不是您的目标,但您可能想知道pandas库是为这样的任务量身定制的;在这里,您可以按照您可能感兴趣的test_nameperform whatever aggregatation对行进行分组。例如,如果您对每个组中的最小和最大中位数感兴趣,则可以执行以下操作: / p>

In [1]: import pandas as pd

In [2]: df = pd.read_csv('some.csv')

In [3]: df
Out[3]:
     test_name   "Mean"   "Median"   "Std_Dev"
0  Data Name 1       50         75          10
1  Data Name 2       52         80          11
2  Data Name 1       53         79           9
3  Data Name 2       55         78           8
4  Data Name 3       54         77           7
5  Data Name 3       53         71           7
6  Data Name 1       51         72           8

In [4]: df.groupby('test_name')[' "Median"'].agg([min, max])
Out[4]:
             min  max
test_name
Data Name 1   72   79
Data Name 2   78   80
Data Name 3   71   77