2016-07-29 10 views
1

Mein Eingang CSV wie dieseDa mehrere zwei Spalten Sätze eines Min-/Max-wie-Index zurück, wenn eine Zahl zwischen min/max

sieht fällt
Tier | A |  | B |  | C | 
     | Min | Max | Min | Max | Min | Max 
1  | 0 | .5 | 0 | .25 | 0 | .92 
2  |.51 | 1.0 | .26 | .50 | .93 | 1.5 

ein Eingang Wörterbuch {A: .56, B: .22, C: .99} Ich mag Gegeben {A: 2, B: 1, C: 2} zurückzukehren, die Ebenen entsprechend der Anzahl innerhalb des Bereichs.

Mein Problem ist, dass ich nicht sicher bin, wie man den Header in einen Multi-Index liest, oder auch wenn es sich lohnt, zu stören.

Momentan habe ich versucht, die Spalten zu zippen und sie dann in Tupel mit einer Spalte umzuwandeln, wobei die Tupel unter jeder Min/Max-Menge pro "A B C" -Satz gespeichert werden. Ich denke auch darüber nach, die max-Spalte herunter zu gehen und die erste Ebene zu finden, unter der die Nummer steht.

Aber diese scheinen nicht der beste Weg, dies zu tun, irgendwelche Tipps?

+0

ist Ihre Eingabe csv aufgenommen als eine Liste von Dicts oder verschachtelt dicts/json? –

+0

Momentan wird es nur als Datenframe aufgenommen, wobei die Leerstellen NaN sind. Meine derzeitige Lösung besteht darin, jedes Min/Max als Tupel zu speichern und dann die Tupel in einem Wörterbuch unter ihrer Kategorie zu speichern. Um dann die Stufe zu ziehen, iteriere ich durch jede Kategorie, dann jedes Tupel, bis die Zahl zwischen den beiden liegt, und gebe dann eine Stufe basierend auf einem Zähler zurück. – SharpObject

Antwort

2

Die ersten paar Zeilen überspringen. Sie können den Kwarg header=[0,1] verwenden, um die ersten zwei Zeilen als MultiIndex zu lesen, aber die fehlenden Werte in Ebene 0 verursachen die Verwendung von Platzhalternamen (in den Spalten ohne 'A', 'B' oder 'C') .

Siehe read_csvdocs, um weitere Informationen über die args/kwargs

df = pd.read_csv('tmp.csv', sep=' *\| *', skiprows=2, index_col=0, header=None) 
df.columns = pd.MultiIndex.from_product([('A', 'B', 'C'), ('Min', 'Max')]) 

def get_indicator(letter, val, df): 
    m = (df[letter]['Min'] <= val) & (df[letter]['Max'] >= val) 
    m = m[m] 
    return None if m.empty else m.index[0] 

d = {A: .56, B: .22, C: .99} 

res = {k: get_indicator(k, v, df) for (k, v) in d.items()} 
0

Mit diesem Setup.

arrays = [[0, .5, 0, .25, 0, .92,],[.51,1, .26, .5, .93, 1.5, ]] 
col = pd.MultiIndex.from_product([('A', 'B', 'C'), ('Min', 'Max')]) 
df  = pd.DataFrame(arrays, columns=col) 

    A   B   C  
    Min Max Min Max Min Max 
0 0.00 0.5 0.00 0.25 0.00 0.92 
1 0.51 1.0 0.26 0.50 0.93 1.50 


dd  = {'A':.56,'B':.22, 'C':.99} 

dieses Versuchen:

ddOut = {} 
for k,v in dd.iteritems(): 
    if v <= df[(k, "Max")][0]       : ddOut[k] = 1 
    elif v >= df[(k, "Max")][0] and v < df[(k, "Max")][1]: ddOut[k] = 2 

print ddOut 
{'A': 2, 'C': 2, 'B': 1} 
Verwandte Themen