2017-03-07 65 views
1

我要使用循環來查找python2.7三種元素中每最小分歧每三個要素的細微差別for循環找到使用python2.7

這是我test.csv數據

E1-2 u7 4 
E1-2 u7 7 
E1-2 u7 8 
F(1)-1 u7 3 
F(1)-1 u7 9 
F(1)-1 u7 8 
..  .. .. 

,我希望得到以下結果

E1-2 u7 7 
E1-2 u7 8 
F(1)-1 u7 8 
F(1)-1 u7 9 
..  .. .. 

因爲在組「E1-2」,最小差元素是7,8

8-4=5 
8-7=1 # the minimal difference 
7-4=3 

這是我的感冒,但有一些問題。誰可以幫我修改它?謝謝。

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b)` 

def mins (datas): 
mi=min(pairwise(sorted(datas)), key=lambda x: x[1] - x[0]) 
return list(mi)` 

import pandas as pd 
qrt=pd.read_csv("test.csv") 

def cul(dat,sam): 
#results=pd.DataFrame() 
a=dat.iloc[0:2] 
b=pd.Series(mins(dat[sam].tolist())) 
a.loc[:,'D']=b 
return a` 

for i in range(0,len(qrt["Ct"])-1,3): 
    results=pd.DataFrame() 
group=qrt[i:i+3] 
c=cul(group,"Ct") 
results=results.append(c) 
print results.head() 

輸出:

Sample Detector  Ct  D 
0 E1-2  u7 4 7 
1 E1-2  u7 7 8 
    Sample Detector  Ct D 
3 F(1)-1  u7 3 NaN 
4 F(1)-1  u7 9 NaN 
+0

做Shoudn't'F(1)-1'有'9'和'8'之間的最小差異? –

+0

是的,我有一個錯誤。謝謝。 – hope

回答

0
from collection import defaultdict 
import itertools 
import csv 

d = defaultdict(list) 
with open("test.csv", newline='') as f: 
    r = csv.reader(f) 
    for row in r: 
     row[2] = float(row[2]) 
     d[row[0]].append(row) 

for k, v in d.items(): 
    a, b = min(itertools.combinations(v, 2), key=lambda x: abs(x[0][2]-x[1][2])) 
    print(a) 
    print(b) 

我們將使用itertools.combinations找到所有的元素對,然後找到一對,讓我們的最小差異,並在對打印的每一個元素。您可以取代那些print s的任何你想要的數據

0
data = [("a", 3), ("a", 5), ("a", 8), ("b", 18), ("b", 13), ("b", 19)] 

indexes = set(index for index, _ in data) 

index_values = {index:[value for i, value in data if i == index] for index in indexes} 

from itertools import combinations 

def difference(pair): 
    x, y = pair 
    return abs(x - y) 

def smallest_difference(values): 
    min_diff, min_pair = min((difference(pair), pair) for pair in combinations(values,2)) 
    return min_pair 

index_min_pairs = {index:smallest_difference(values) for index, values in index_values.items()} 

answer = [(index, min_value) for index in index_min_pairs for min_value in index_min_pairs[index]]