2017-10-23 3 views
1

Ich suche Rat für die beste Methode zum Sortieren meines Datasets.Python - Extrahieren einer Liste von Bezeichnern und entsprechenden Werten

Ich habe folgende Eingabe („data.txt“):

100 G(1,2)   1.0943   
100 G(1,3)   1.0933 
101 G(1,2)   1.5147   
101 G(1,3)   1.2372 
101 G(1,4)   1.0955 
... (10,000) 

Der ideale Ausgang ist eine Textdatei mit Spalten:

G(1,2)  G(1,3)   G(1,4) 
1.0943  1.0933   1.0955 
1.5147  1.2372 

Mein erster Gedanke ist es, ein Wörterbuch erstellen mit mehrere Werte - wobei jedes 'G (x, x)' ein Schlüssel ist und die entsprechende Zahl ein Wert ist.

Wäre dies der beste Weg, um dies zu erreichen, oder gibt es eine andere Python-Funktion, die das Sortieren effizienter machen würde?

Vielen Dank an alle für Ihre Vorschläge - ich bin dabei, die Funktion itertools.groupby zu nutzen/zu lernen, wie von einigen Benutzern unten vorgeschlagen. Der Pandas Resorting-Ansatz ist auch sehr hilfreich.

+1

Eine bessere Methode als Dies. Aber wenn Sie ein Wörterbuch mit G (x, x) als Schlüssel hätten, wäre es besser, einen Schlüssel für jedes G (x, x) zu haben, dann die Werte des Diktats als Liste übereinstimmender Zahlen. – chasmani

Antwort

1

Sie können itertools.groupby verwenden:

import re 
import itertools 
data = [[b for b in c if b] for c in [re.split("\s+", i.strip('\n')) for i in open('file.txt')] if c] 
new_final_data = [(a, list(b)) for a, b in itertools.groupby(sorted(data, key=lambda x:x[1][-2]), key=lambda x:x[1])] 
final_data = {a:[[c for c in i if re.findall('\d+\.\d+', c)][0] for i in b] for a, b in new_final_data} 
print(final_data) 

Ausgang:

{'G(1,3)': ['1.0933', '1.2372'], 'G(1,4)': ['1.0955'], 'G(1,2)': ['1.0943', '1.5147']} 
1

Ich glaube, Sie es als Transponierungsfunktion tun, dann ein groupby. https://pandas.pydata.org/pandas-docs/stable/dsintro.html?highlight=transpose

+0

Dies ist eine Nur-Link-Antwort. Stellen Sie sicher, dass Sie alle relevanten Informationen über den Link hier bearbeiten, da die Antwort auch dann eigenständig sein sollte, wenn der Link veraltet ist. Links sollten zum Ankreuzen, Referenzieren oder Lesen verwendet werden und nicht als Suche nach einer Antwort. – Reti43

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18810110) – Bucket

1

In gerade Python (verwenden Sie ein Shell):

import re 
from collections import defaultdict  

data = defaultdict(list) 

with open('data.txt') as f: 
    for line in f: 
     match = re.match('.*(G\(\d,\d\))\s*(.*)', line) 
     g = match.group(1) 
     datum = float(match.group(2)) 
     data[g].append(datum) 


for g in data: 
    data[g].sort() 

# do something with data. 
1

Die Pandas Ansatz so etwas wie dieses würde:

import pandas as pd 

df = pd.read_csv(r'data.txt', names = ['col1', 'col2', 'col3']) 
df = df[['col2', 'col3']] 
df = df.pivot(columns = 'col2', values = 'col3') 
df = df.apply(lambda x: pd.Series(x.dropna().values)) 
df = df.to_csv(r'output.txt', index = False, sep = '\t') 

Ausgang:

G(1,2) G(1,3) G(1,4) 
1.0943 1.0933 1.0955 
1.5147 1.2372 
Verwandte Themen