Daten als csv einlesen und strukturieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

Code: Alles auswählen

import csv

data = csv.reader(open('/home/neuron/M381S7.csv', "rb"),delimiter=',')
data.next()
data_list = []
data_list.extend(data)
D = []
D1 = []
D2  = []
LY1 = []
LY2 = []


for data in data_list:
    D.append(data[0])
    D1.append(data[1])
    D2.append(data[2])
    LY1.append(data[3])
    LY2.append(data[4])
# Remove empty fields from strings
nD = [feld for feld in D if feld != '']
nD1 = [feld for feld in D1 if feld != '']
nD2 = [feld for feld in D2 if feld != '']
nLY1 = [feld for feld in LY1 if feld != '']
nLY2 = [feld for feld in LY2 if feld != '']

#convert strings to floats
V1 = [float(value) for value in nD]
V2 = [float(value) for value in nD1]
V3 = [float(value) for value in nD2]
V4 = [float(value) for value in nLY1]
V5 = [float(value) for value in nLY2]
print "List"
List = [V1,V2,V3,V4,V5]
print List
Hallo zusammen! ich möchte einen Datensatz als csv einlesen und dann strukturieren, um damit arbeiten zu können.
Der Datensatz besteht aus 5 Spalten die unterschiedlich lang sind. Ich bin noch recht neu in python. Der Code funktioniert in dieser Form , allerdings ist das sehr umständlich und unelegant von mir geschrieben. Ich habe schon nach möglichkeiten gesucht mit shape etc. Aber so richtig schlau geworden bin ich noch nicht. Vllt hat jemand Vorschlage wie man data_list (wird ja in Zeilen eingelesen) in einen mehrdimensionalen array, aber in spaltenform umwandelt, daraus die leereinträge entfernt und dann in einen float konvertiert, ohne das ganze Prozedere da oben.
Vielen Dank im voraus! Vllt hat noch jemand eine Idee wie man files interaktiver (habe schon von tkinter - askobenfilname gehört)einliest, als in dieser hardcoding Form.
Neuron :)
Zuletzt geändert von Anonymous am Mittwoch 19. Juli 2017, 14:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Neuron23: wieso gibt es Leereinträge? Sind diese immer für alle Spalten leer? Wenn nicht, hast Du zum Schluß inkonsistente Spalten. Es ist generell keine gute Idee, zusammengehörige Daten in unterschiedliche Listen zu speichern. Was willst Du damit später machen?

Zum Code: Dateien die man öffnet sollte man auch wieder schließen. csv-Dateien sind Text-Dateien.

Code: Alles auswählen

import csv
data = []
with open('/home/neuron/M381S7.csv') as lines:
    rows = csv.reader(lines, delimiter=',')
    _ = rows.next() # skip header
    for row in rows:
        if not row[0].strip(): # skip empty lines
            data.append(tuple(map(float, row[:5])))
print(data)
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

Es sind verschiedene Zeitpunkte in einem Experiment als T1 T2 T3 etc.
Ich werde anschließend über alles Werte zu einem Timepoint den Mittelwert bilden, Timecourse plotten und die statistische auswertung machen.
Deswegen benötige ich die verschiedenen Spalten, die unterschiedlich lang sind

Das ist der array wenn ich mit data_list ausgeben lasse
[['0.85144', '0.46366', '0.028444', '0.0070071', '1.3707', ''], ['0.58074', '0.42699', '0.076903', '0.018472', '0.46648', ''], ['1.02', '0.31156', '0.1766', '0.015734', '0.31127', ''], ['0.95387', '0.23838', '0.012887', '0.010173', '0.57243', ''], ['', '0.38575', '0.012014', '0.075074', '0.3672', ''], ['', '2.1345', '', '-0.0000691', '0.38292', ''], ['', '', '', '', '0.1833', '']]
Das ist die list die ich am Ende brauche
[[0.85144, 0.58074, 1.02, 0.95387], [0.46366, 0.42699, 0.31156, 0.23838, 0.38575, 2.1345], [0.028444, 0.076903, 0.1766, 0.012887, 0.012014], [0.0070071, 0.018472, 0.015734, 0.010173, 0.075074, -6.91e-05], [1.3707, 0.46648, 0.31127, 0.57243, 0.3672, 0.38292, 0.18338]]
BlackJack

@Neuron23: Wäre es da nicht sinnvoller gleich auf so etwas wie Pandas zu setzen statt sich das selbst zu programmieren‽
Neuron23
User
Beiträge: 8
Registriert: Mittwoch 19. Juli 2017, 13:32

Vielen lieben Dank für den tollen Tipp.
Allerdings habe ich eine Frage berzüglich der NaN
0 0.85144 0
1 0.42699
2 0.31156
3 0.23838
4 0.38575
5 2.13450
6 NaN

0 0.46366
1 0.58074
2 1.02000
3 0.95387
4 NaN
5 NaN
6 NaN
Die Spalten haben unterschiedliche NaN. das war jetzt für den Mittelwert kein Problem. Allerdings ist die Berechnung des Standard Errors of the mean ein Problem. Dafür brauche ich ja die Gesamtanzahl der Datenpunkte. Allerdings ist die 7 obwohl ich ja nur 4habe.
ich habe schon dropna() probiert. Allerdings verliere ich da ganze Zeilen. Gibt es auch eine Möglichkeit, einzelne NaN zu entfernen ? Ohne gleich ganze Zeilen wegzunehmen
st = stats.sem(df["V"])
Das war die funktion die ich benutzt habe
Danke schon mal
Antworten