PD DF Gleiche Spalten Namen (Same Columns Names)

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
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Hallo,

Ich habe meine Fehler selber gefunden...... Ich habe beim letzten Befehle df.to_csv den falschen datenframe verwendet! Aber ich bin offen für semantische Tipps und andere Optimierung. Entschuldigung das ich zu früh gepostet habe!

ich bearbeite gerade einen Riesigen Datensatz. Welcher verschiedene Wellenlängen des Lichtes zu verschiedenen Zeiten hat. Ich hoffe ich habe mich nicht wieder zu dämlich angestellt und es ist nur eine Kleinigkeit. :D

Sieht in etwa so aus:
Time [s] 400 402 404 ... 994 996 998 1000
1 0 0.0943 0.0937 0.0931 ... 0.1534 0.1515 0.148 0.1467
2 127.397 0.0944 0.0937 0.0932 ... 0.1533 0.1501 0.1488 0.1466
3 253.524 0.0941 0.0936 0.093 ... 0.1536 0.1506 0.1481 0.1458
4 380.461 0.0944 0.0938 0.0931 ... 0.1549 0.1517 0.1487 0.1492
5 507.651 0.0941 0.0935 0.0929 ... 0.1558 0.151 0.1495 0.1477
.. ... ... ... ... ... ... ... ... ...
197 25044.7 0.0936 0.0931 0.0922 ... 0.1685 0.1662 0.1647 0.163
198 25171.8 0.0935 0.0929 0.0924 ... 0.168 0.1663 0.1634 0.1619
199 25298.6 0.0935 0.0931 0.0924 ... 0.1681 0.1665 0.1629 0.1628
200 25425.3 0.0935 0.0929 0.0923 ... 0.1698 0.1662 0.1651 0.1635
201 25552.5 0.0936 0.0931 0.0923 ... 0.1694 0.1662 0.163 0.1615


Die Wellenlänge geht immer von 400 bis 1000 danach fängt der es für die nächste Probe wieder bei 400 an.
Nun möchte ich gerne die einer Probe (also eines Blockes 400 bis 1000 plus die dazu gehörige Zeit) in ein eigenen df bzw in eine eigene csv datei speichern.
Wenn ich meine code wie unten eingefügt ausführe dann habe ich zwei Probleme:

1. verliere ich die Zeit obwohl ich extra davor versucht habe diese mir zu sichern in einen neuen datenframe.
2. es werden immer alle cols mit dem gleichen namen angefügt. Ich dachte mit der .iloc Funktion kann ich über die Position iterieren.


Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt

filename = 'ExcelFiles/datenPlateReader/Platereader_testDaten.csv'

df_import = pd.read_csv(filename, delimiter= ';')
df_import.dropna()
df_transponded = df_import.transpose()
header = df_transponded.iloc[0]
df = df_transponded[1:]
df = df.rename(columns = header)

del df['Temp. [C]'] ## Nicht benötigte Daten
del df['Well / Wavelength'] ##Leeres Col


i = 400
l = 0
j = 1
for col in df:
    if i < 1000:
        df_to_csv[str(i)] = df.iloc[:,l]
        i = i + 2
        l = l + 1
        #print("Das ist i:" + str(i))
        #print("dast ist l:" + str(l))
    else:
        df.to_csv('C:/Users/fabio/OneDrive/Uni/Semester 3/Vertiefungspraktikum/Python Scripts/ExcelFiles/datenPlateReader/Datensaetz/firstExperiment/A' + str(j) + '.csv', header = True, sep=';')
        break
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

`l` ist ein bescheuerter Variablenname, ich lese da `df.iloc[:, eins]`.
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe die Datei nicht, was ist in den Spalten und was in den Zeilen?

Die Zeit sollte ein Index sein und keine Spalte, dann geht die auch beim Slicen nicht verloren. Und wenn Du schon weißt, wie viele Datensätze zusammen gehören, dann benutz Slicing: df.iloc[n*300: (n+1)*300]
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Snake_py: Bei solchen Fragen ist es immer hilfreich die Beispieldaten so zu präsentieren, dass man sie leicht in einen `DataFrame` überführen kann, mit dem man dann experimentieren kann. Also beispielsweise so:

Code: Alles auswählen

     Time [s]     400     402     404    994     996     998    1000
1    0        0.0943  0.0937  0.0931   0.1534  0.1515   0.148  0.1467
2    127.397  0.0944  0.0937  0.0932   0.1533  0.1501  0.1488  0.1466
3    253.524  0.0941  0.0936   0.093   0.1536  0.1506  0.1481  0.1458
4    380.461  0.0944  0.0938  0.0931   0.1549  0.1517  0.1487  0.1492
5    507.651  0.0941  0.0935  0.0929   0.1558   0.151  0.1495  0.1477
197  25044.7  0.0936  0.0931  0.0922   0.1685  0.1662  0.1647   0.163
198  25171.8  0.0935  0.0929  0.0924   0.168  0.1663  0.1634  0.1619
199  25298.6  0.0935  0.0931  0.0924   0.1681  0.1665  0.1629  0.1628
200  25425.3  0.0935  0.0929  0.0923   0.1698  0.1662  0.1651  0.1635
201  25552.5  0.0936  0.0931  0.0923   0.1694  0.1662   0.163  0.1615
Weil man das mit `read_clipboard()` leicht aus der Zwischenablage einlesen kann:

Code: Alles auswählen

In [24]: df = pd.read_clipboard(sep="  +")                                      

In [25]: df                                                                     
Out[25]: 
      Time [s]     400     402     404     994     996     998    1000
1        0.000  0.0943  0.0937  0.0931  0.1534  0.1515  0.1480  0.1467
2      127.397  0.0944  0.0937  0.0932  0.1533  0.1501  0.1488  0.1466
3      253.524  0.0941  0.0936  0.0930  0.1536  0.1506  0.1481  0.1458
4      380.461  0.0944  0.0938  0.0931  0.1549  0.1517  0.1487  0.1492
5      507.651  0.0941  0.0935  0.0929  0.1558  0.1510  0.1495  0.1477
197  25044.700  0.0936  0.0931  0.0922  0.1685  0.1662  0.1647  0.1630
198  25171.800  0.0935  0.0929  0.0924  0.1680  0.1663  0.1634  0.1619
199  25298.600  0.0935  0.0931  0.0924  0.1681  0.1665  0.1629  0.1628
200  25425.300  0.0935  0.0929  0.0923  0.1698  0.1662  0.1651  0.1635
201  25552.500  0.0936  0.0931  0.0923  0.1694  0.1662  0.1630  0.1615
`transponded` sollte wohl `transposed` heissen. Das was da mit der Zeitspalte gemacht wird sieht umständlich aus, denn eigentlich ist das ja der Index, also wäre das mein erster Schritt, das auch wirklich zum Index des DataFrame zu machen.

Was da mit `i` gemacht wird ist komisch. Der Wert sorgt auf etwas undurchsichtige Weise dafür das er immer den gleichen Wert wie der (Pandas-)Index der entsprechenden gerade verarbeiteten Zeile hat. Also hoffentlich, denn geprüft wird das nicht. Statt den Wert von dort zu übernehmen.

Mir ist nicht so ganz klar wie das Ergebnis aussehen soll, ich hoffe ich habe richtig verstanden das pro Zeitstempel eine Datei erstellt werden soll, man also DataFrames braucht die alle Werte für die Wellenlängen zu einem bestimmten Zeitpunkt benötigt.

Dazu würde ich die Daten erst einmal in ein ”aufgeräumtes” Format bringen, also pro Beobachtungswert eine Zeile. Dann die Zeit als Index setzen und darüber gruppieren:

Code: Alles auswählen

#!/usr/bin/env python3
import io

import pandas as pd

DATA_FILE = io.BytesIO(
    b"""\
     Time [s]     400     402     404    994     996     998    1000
1    0        0.0943  0.0937  0.0931   0.1534  0.1515   0.148  0.1467
2    127.397  0.0944  0.0937  0.0932   0.1533  0.1501  0.1488  0.1466
3    253.524  0.0941  0.0936   0.093   0.1536  0.1506  0.1481  0.1458
4    380.461  0.0944  0.0938  0.0931   0.1549  0.1517  0.1487  0.1492
5    507.651  0.0941  0.0935  0.0929   0.1558   0.151  0.1495  0.1477
197  25044.7  0.0936  0.0931  0.0922   0.1685  0.1662  0.1647   0.163
198  25171.8  0.0935  0.0929  0.0924   0.168  0.1663  0.1634  0.1619
199  25298.6  0.0935  0.0931  0.0924   0.1681  0.1665  0.1629  0.1628
200  25425.3  0.0935  0.0929  0.0923   0.1698  0.1662  0.1651  0.1635
201  25552.5  0.0936  0.0931  0.0923   0.1694  0.1662   0.163  0.1615
"""
)


def main():
    df = pd.read_csv(DATA_FILE, delimiter="  +", engine="python")
    print("Eingelesene Daten:")
    print(df)
    print("-" * 50)

    print("Nach melt-Operation:")
    print(df.melt(id_vars=["Time [s]"], var_name="wavelength"))
    print("-" * 50)

    print("Zeit als Index:")
    print(
        df.melt(id_vars=["Time [s]"], var_name="wavelength").set_index(
            "Time [s]"
        )
    )
    print("-" * 50)
    
    print("Nach Index (Zeit) gruppiert:")
    for _, sub_df in (
        df.melt(id_vars=["Time [s]"], var_name="wavelength")
        .set_index("Time [s]")
        .groupby(level=0)
    ):
        print(sub_df)
        print("-" * 50)


if __name__ == "__main__":
    main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

@__blckjack__

Vielen Dank für deine Erneute Hilfe!

Ich muss mich Entschuldigen, weil ich mich nicht so klar ausgedrückt habe! Meine Rohdaten sehen so aus

Code: Alles auswählen

"Undefinierte Anzahl an Leerstellen"
A1			1	2	3	4	5	6	7	
Time [s]		0	127.397	253.524	380.461	507.651	...
Temp. [°C]		24.4	22.6	23.2	22.4	23.4	23.4	23.1	...
400			0.0943	0.0944	0.0941	0.0944	0.0941	0.0942	0.0939	...
402			0.0937	0.0937	0.0936	0.0938	0.0935	0.0937	0.0936	...
404			0.0931	0.0932	0.093	0.0931	0.0929	0.093	0.093	...
406			0.0927	0.0927	0.0926	0.0927	0.0925	0.0926	0.0925	...
408			0.0924	0.0921	0.0922	0.0922	0.092	0.0921	0.092	...
410			0.0916	0.0919	0.0916	0.0918	0.0916	0.0916	0.0916	...
412			0.0912	0.0914	0.0912	0.0912	0.0911	0.0911	0.0908	...
414			0.0908	0.0911	0.0909	0.0907	0.091	0.0907	0.0906	...
416			0.0902	0.0903	0.0904	0.0903	0.0902	0.0902	0.0902	...
418			0.0902	0.0905	0.0899	0.0902	0.0901	0.09	0.0901	...
420			0.0899	0.0898	0.0898	0.0898	0.0897	0.0898	0.0897	...
...			....	....	...	....	...	...	...	...
1000			...	...	...	...	...	...	...	...	
"Leerzeile"
Well / Wavelength								
A2			1	2	3	4	5	...
Time [s]		0	127.397	253.524	380.461	507.651
Temp. [°C]		24.4	22.6	23.2	22.4	23.4	...
400			0.1483	0.1495	0.1522	0.1545	0.1557	...
402			0.1473	0.1482	0.1508	0.1535	0.1543	...
404			0.1461	0.147	0.1496	0.1522	0.1528	...
406			0.1449	0.1459	0.1485	0.151	0.1519	...
408			0.1439	0.1449	0.1476	0.1497	0.1506	...
410			0.1428	0.1439	0.1462	0.1488	0.1496	...
412			0.1415	0.1427	0.1451	0.1474	0.1484	...
414			0.1408	0.1419	0.1443	0.1465	0.1474	...
416			0.1395	0.1403	0.1431	0.1451	0.1462	...
418			0.1389	0.1399	0.1421	0.1446	0.1453	...
420			0.1381	0.1387	0.1413	0.1435	0.1443	...
...			....	....	...	....	...	...
1000			...	...	...	...	...	...
Somit habe ich zu jedem Zeitstempel ein Spektrum aufgenommen und bekomme dann einen Wert pro Wellenlängen pro Zeit pro Probe!

Somit geht "Ein" Datensatz geht immer von t0 bis tend und von 400nm bis 1000nm!

Links im Eck steht immer die Probennummer z.B. A1 oder A2 usw. Das Gerät wirft alle Poben in eine csv Datei! (Ich habe immer so 48 Proben pro Versuch :D)

Meine csv Datei sieht also so wie oben dargestellt aus. Über der ersten Probe (A1) stehen noch die gewählten Parameter die ich händisch aus der csv rauslösche, wodurch eine die Leerstellen entstehen und deshalb nutze ich die dropna() funktion.
__blackjack__ hat geschrieben: Mittwoch 30. Oktober 2019, 14:10 `transponded` sollte wohl `transposed` heissen. Das was da mit der Zeitspalte gemacht wird sieht umständlich aus, denn eigentlich ist das ja der Index, also wäre das mein erster Schritt, das auch wirklich zum Index des DataFrame zu machen.
Der Zeitstempel ist für alle Proben Gleich da alle immer zur gleichen Zeit gemessen werden. Wobei dies mein erster workaround war für das eigentliche Problem!

Ich nutze die transpose() funktion damit ich die Daten besser ansprechen kann. Aber alles was es macht ist dass meine cols nun nicht mehr einzigartig sind und wenn ich nun:

Code: Alles auswählen

df['time']
schreibe dann werden natürlich alle spalten ausgewählt mit diesem index, deshalb dachte ich lösche die gleich raus und iterriere dann über den df bei position mit:

Code: Alles auswählen

df.iloc[:,l]
und schreibe dann den neu erstellten Datensatz immer in ein eigene csv Datei so dass ich am Ende pro Probe eine aufbereitete csv datei erhalte für die weiterverarbeitung. "Was im übrigen auch die Forderung von meinem Chef ist" "Wenn man ihn so nennen darf."

Mein bisheriger Code funktioniert für den ersten Datensatz wunderbar, aber ich bekomme es nun nicht hin, dass sich die funktion selbst wieder ruft um den nächsten datensatz einzulesen.

Der Datensatz nach dem transponieren:

Code: Alles auswählen

	Time [s]	400	402	404	406
1	0		0.0943	0.0937	0.0931	0.0927
2	127.397		0.0944	0.0937	0.0932	0.0927
3	253.524		0.0941	0.0936	0.093	0.0926
4	380.461		0.0944	0.0938	0.0931	0.0927
5	507.651		0.0941	0.0935	0.0929	0.0925
6	635.082		0.0942	0.0937	0.093	0.0926
7	762.62		0.0939	0.0936	0.093	0.0925
8	890.159		0.0939	0.0936	0.0929	0.0924

Ich glaube auch, dass ich das ganze wieder viel zu Kompliziert angehe!

AM coolsten wäre es wenn ich einfach mit der Samplenummer arbeiten könnte. Wahrscheinlich sollte ich das Programm nochmal neu Schreiben. Es ist mir auch noch ein Dorn im Auge wie ich meine Schleife Kontrolliere dies sollte ich noch anders machen, am besten nach Leerstelle sollte aber glaub mit .... funktionieren:

Code: Alles auswählen

np.isnan()
Ich hoffe ich habe nicht zu viel geschrieben un mich verständlicher ausgedrückt. Nochmal vielen dank dass du dir die Zeit genommen hast!
Ich mache mich glaub wieder ans coden/Weinen :D :D
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Snake_py: Deine Rohdaten lassen sich so nicht sinnvoll mit Pandas einlesen. Also nicht einfach so mit der `read_csv()`-Funktion. Denn da ist ja im Grunde ein DataFrame pro Probe enthalten. Erster Schritt wäre also diese Datei so zu teilen, dass man nur noch die Daten für jeweils eine Probe hat. Was soll sich denn ausser dieser Aufteilung noch ändern an den Daten? Wie soll denn das Ergebnis aussehen?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Nun das Ergebniss soll so aussehen das ich nachher pro datensatz eine csv datei habe die so aussehen soll:

so kann ich ja dann die datensätze nach bedarf laden und verarbeiten.

Code: Alles auswählen

	Time [s]	400	402	404	406
1	0		0.0943	0.0937	0.0931	0.0927
2	127.397		0.0944	0.0937	0.0932	0.0927
3	253.524		0.0941	0.0936	0.093	0.0926
4	380.461		0.0944	0.0938	0.0931	0.0927
5	507.651		0.0941	0.0935	0.0929	0.0925
6	635.082		0.0942	0.0937	0.093	0.0926
7	762.62		0.0939	0.0936	0.093	0.0925
8	890.159		0.0939	0.0936	0.0929	0.0924
__blackjack__ hat geschrieben: Mittwoch 30. Oktober 2019, 19:52 @Snake_py: Deine Rohdaten lassen sich so nicht sinnvoll mit Pandas einlesen. Also nicht einfach so mit der `read_csv()`-Funktion. Denn da ist ja im Grunde ein DataFrame pro Probe enthalten. Erster Schritt wäre also diese Datei so zu teilen, dass man nur noch die Daten für jeweils eine Probe hat. Was soll sich denn ausser dieser Aufteilung noch ändern an den Daten? Wie soll denn das Ergebnis aussehen?
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

Ohne Transponieren würden einfache Stringoperationen auf einem Fileobjekt reichen.
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Ja nach dem letzten kommentar von __blackjack__

dachte ich auch, dass ich es nun mit with open versuchen werde und dann die Zeilen erstmal in eine liste einlese.

oder was meinst du @Sirius3 ?

Sirius3 hat geschrieben: Mittwoch 30. Oktober 2019, 20:22 Ohne Transponieren würden einfache Stringoperationen auf einem Fileobjekt reichen.
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Ok So weit bin ich bis jetzt gekommen. Ich habe in den 2 Tagen wo ich hier bin schon gut was gelernt. Nun ist das Problem das der Letzte Datensatz nicht eingelesen wird...... Ist Komisch weil immer wenn ich den Datensatz vergrößer ist es wirklich immer der Letzte Datensatz der verloren geht.... Obwohl die If Bedingung in der repeater funktion ture sein müsste verrutscht es immer für den letzten Datensatz um eine Zeile.

Code: Alles auswählen

import pandas as pd

filename = 'ExcelFiles/datenPlateReader/Platereader_testDaten.csv'


def import_data(filename):
    with open (filename, 'r') as file:
            return [row.strip().split(";") for row in file]

def sort_save_data_set(imported_data,count):
    data_set_list = []
    amount_of_rows = 0
    for data in imported_data:
        if data[0] != "":
            amount_of_rows = amount_of_rows + 1
        else:
            data_set_list = imported_data[:amount_of_rows] ## Erstelle liste für df
            #print(data_set_list[amount_of_rows - 1])
            del imported_data[:amount_of_rows+1] ## Lösche Datensatz aus Hauptliste
            df = pd.DataFrame(data_set_list) ## Liste into df
            df = df.transpose() ##transpose
            header = df.iloc[0]
            df = df[1:]
            df = df.rename(columns = header)
            df.to_csv('C:/Users/OneDrive/Uni/Semester 3/Vertiefungspraktikum/Python Scripts/ExcelFiles/datenPlateReader/Datensaetz/firstExperiment/'+ str(count) +'.csv', header = True, sep =';')
            break
    repeater(imported_data,count)


def repeater(remaining_data,count):
    if remaining_data[0][0] == 'Well / Wavelength':
         count = count + 1
        # print("true")
         del remaining_data[0]
         sort_save_data_set(remaining_data,count)
    else:
        print("Die Dateien wurden ertellt!")
        #print(remaining_data[0])


def main(filename):
    count = 1
    imported_data = import_data(filename)
    remaining_data = sort_save_data_set(imported_data,count)



if __name__ == "__main__":
    main(filename)
Sirius3
User
Beiträge: 18218
Registriert: Sonntag 21. Oktober 2012, 17:20

Diese komische Art und Weise, wie Du hier Rekursion benutzt, ist sehr schwer zu verstehen.
Teile Deine Aufgabe in mehrere Unterprobleme:
1. Lesen der Datei (erledigt)
2. Aufspalten der Datei an Leerzeilen
3. Header-Löschen und Speichern
Die drei Schritte stehen in main und könnten so aussehen:

Code: Alles auswählen

def main():
    table = import_data(filename)
    blocks = split_table(table)
    for index, block in enumerate(blocks):
        write_new_csv(block, 'C:/Users/OneDrive/Uni/Semester 3/Vertiefungspraktikum/Python Scripts/ExcelFiles/datenPlateReader/Datensaetz/firstExperiment/{}.csv'.format(index))
Die zwei übrigen Funktionen kannst Du dir selbst überlegen
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ich Schritt 1 nicht machen würde, sondern das parsen der einzelnen Blöcke in DataFrames Pandas überlassen würde statt da selbst mit `split()` an die Zeilen dran zu gehen.

So ein einzelner Block sieht dann ja so aus (mal davon abgesehen das der Trenner das Semikolon ist):

Code: Alles auswählen

A2          1   2   3   4   5 
Time [s]        0   127.397  253.524  380.461  507.651
Temp. [°C]      24.4    22.6    23.2    22.4    23.4  
400         0.1483  0.1495  0.1522  0.1545  0.1557
402         0.1473  0.1482  0.1508  0.1535  0.1543
404         0.1461  0.147   0.1496  0.1522  0.1528
406         0.1449  0.1459  0.1485  0.151   0.1519
408         0.1439  0.1449  0.1476  0.1497  0.1506
410         0.1428  0.1439  0.1462  0.1488  0.1496
412         0.1415  0.1427  0.1451  0.1474  0.1484
414         0.1408  0.1419  0.1443  0.1465  0.1474
416         0.1395  0.1403  0.1431  0.1451  0.1462
418         0.1389  0.1399  0.1421  0.1446  0.1453
420         0.1381  0.1387  0.1413  0.1435  0.1443
Das in ein `io.StringIO` verpackt lässt sich dann analog zu folgendem mit `read_csv()` in einen DataFrame umwandeln, gleich mit ignorieren der ersten Zeile und setzen der ersten Spalte als Index:

Code: Alles auswählen

In [180]: df=pd.read_clipboard(sep="  +", skiprows=1, header=None, index_col=0) 

In [181]: df                                                                    
Out[181]: 
                  1         2         3         4         5
0                                                          
Time [s]     0.0000  127.3970  253.5240  380.4610  507.6510
Temp. [°C]  24.4000   22.6000   23.2000   22.4000   23.4000
400          0.1483    0.1495    0.1522    0.1545    0.1557
402          0.1473    0.1482    0.1508    0.1535    0.1543
404          0.1461    0.1470    0.1496    0.1522    0.1528
406          0.1449    0.1459    0.1485    0.1510    0.1519
408          0.1439    0.1449    0.1476    0.1497    0.1506
410          0.1428    0.1439    0.1462    0.1488    0.1496
412          0.1415    0.1427    0.1451    0.1474    0.1484
414          0.1408    0.1419    0.1443    0.1465    0.1474
416          0.1395    0.1403    0.1431    0.1451    0.1462
418          0.1389    0.1399    0.1421    0.1446    0.1453
420          0.1381    0.1387    0.1413    0.1435    0.1443
Dadurch das die erste Spalte als Index gesetzt wurde, landen die Werte bei der Transponierung in den Spaltennamen, yeah!

Code: Alles auswählen

In [182]: df.transpose()                                                        
Out[182]: 
0  Time [s]  Temp. [°C]     400     402   ...       414     416     418     420
1     0.000        24.4  0.1483  0.1473   ...    0.1408  0.1395  0.1389  0.1381
2   127.397        22.6  0.1495  0.1482   ...    0.1419  0.1403  0.1399  0.1387
3   253.524        23.2  0.1522  0.1508   ...    0.1443  0.1431  0.1421  0.1413
4   380.461        22.4  0.1545  0.1535   ...    0.1465  0.1451  0.1446  0.1435
5   507.651        23.4  0.1557  0.1543   ...    0.1474  0.1462  0.1453  0.1443

[5 rows x 13 columns]
Da jetzt noch die Temperaturspalte entfernen, und speichern.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Ja aber ich muss die Blöcke ja erstmal zu einzelnen Blöcken trennen, wenn die Blöcke dann einzeln sind bekomme ich die Weiterverarbeitung hoffentlich hin ich hin.
__blackjack__ hat geschrieben: Donnerstag 31. Oktober 2019, 12:32 So ein einzelner Block sieht dann ja so aus (mal davon abgesehen das der Trenner das Semikolon ist):

Code: Alles auswählen

A2          1   2   3   4   5 
Time [s]        0   127.397  253.524  380.461  507.651
Temp. [°C]      24.4    22.6    23.2    22.4    23.4  
400         0.1483  0.1495  0.1522  0.1545  0.1557
402         0.1473  0.1482  0.1508  0.1535  0.1543
404         0.1461  0.147   0.1496  0.1522  0.1528
406         0.1449  0.1459  0.1485  0.151   0.1519
408         0.1439  0.1449  0.1476  0.1497  0.1506
410         0.1428  0.1439  0.1462  0.1488  0.1496
412         0.1415  0.1427  0.1451  0.1474  0.1484
414         0.1408  0.1419  0.1443  0.1465  0.1474
416         0.1395  0.1403  0.1431  0.1451  0.1462
418         0.1389  0.1399  0.1421  0.1446  0.1453
420         0.1381  0.1387  0.1413  0.1435  0.1443
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

Das ist ja auch in etwa das was ich versuche nur irgendwie tue ich mich schwer mit dem Aufspalten an Leerstelle:
So in etwa sieht ja mein Liste aus:

Code: Alles auswählen

[["","",""],[...],..]
Ich habe noch nichts gutes gefunden um immer die Empty String Liste anzuwählen.
Sirius3 hat geschrieben: Donnerstag 31. Oktober 2019, 12:01 Diese komische Art und Weise, wie Du hier Rekursion benutzt, ist sehr schwer zu verstehen.
Teile Deine Aufgabe in mehrere Unterprobleme:
1. Lesen der Datei (erledigt)
2. Aufspalten der Datei an Leerzeilen
3. Header-Löschen und Speichern
Die drei Schritte stehen in main und könnten so aussehen:

Code: Alles auswählen

def main():
    table = import_data(filename)
    blocks = split_table(table)
    for index, block in enumerate(blocks):
        write_new_csv(block, 'C:/Users/OneDrive/Uni/Semester 3/Vertiefungspraktikum/Python Scripts/ExcelFiles/datenPlateReader/Datensaetz/firstExperiment/{}.csv'.format(index))
Die zwei übrigen Funktionen kannst Du dir selbst überlegen
Snake_py
User
Beiträge: 23
Registriert: Montag 28. Oktober 2019, 16:29

So nun funktioniert es. Hübsch es definitiv nicht. Ich werde nun aber erstmal meine Daten Plotten und den Code dann nach euren Vorschlägen Optimieren. Bin aber gerade erstmal froh dass er geht :D

Code: Alles auswählen

import pandas as pd

filename = 'ExcelFiles/datenPlateReader/Platereader_testDaten.csv'


def import_data(filename):
    with open (filename, 'r') as file:
            return [row.strip().split(";") for row in file]

def sort_save_data_set(imported_data,count):
    data_set_list = []
    amount_of_rows = 0
    for row in imported_data:
        if row[0] != "" and amount_of_rows+1 < len(imported_data):
            amount_of_rows = amount_of_rows + 1
        else:
            data_set_list = imported_data[:amount_of_rows] ## Erstelle liste für df
            del imported_data[:amount_of_rows+1] ## Lösche Datensatz aus Hauptliste
            df = pd.DataFrame(data_set_list) ## Liste into df
            df = df.transpose() ##transpose
            header = df.iloc[0]
            df = df[1:]
            df = df.rename(columns = header)
            df.to_csv('C:/Users/fabio/OneDrive/Uni/Semester 3/Vertiefungspraktikum/Python Scripts/ExcelFiles/datenPlateReader/Datensaetz/firstExperiment/'+ str(count) +'.csv', header = True, sep =';')
            break
    repeater(imported_data,count)


def repeater(remaining_data,count):
    try:
        if remaining_data[0][0] == 'Well / Wavelength':
            count = count + 1
            del remaining_data[0]
            sort_save_data_set(remaining_data,count)
    except:
        print("Die Dateien wurden ertellt!")


def main(filename):
    count = 1
    imported_data = import_data(filename)
    del imported_data[0]
    remaining_data = sort_save_data_set(imported_data,count)



if __name__ == "__main__":
    main(filename)
Antworten