csv einlesen in array of tuples und sortieren nach tupel-Element

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.
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Moment....

Ja, danke. Funktioniert wunderbar.
--
Grüße
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Krischu: Das `apply()` zum runden ist unnötig umständlich weil `Series`-Objekte eine `round()`-Methode haben.

Am Anfang Spalten mit Dummywerten belegen die nie irgendwo verwendet werden macht keinen Sinn.

Auch bei "Paar" würde ich kein `apply()` verwenden:

Code: Alles auswählen

ds["Paar"] = ((ds["dL [%]"] < 0.2) & (ds["dR [%]"] < 2)).map({True: "P", False: "-"})
Wobei das wie beim runden eher etwas kosmetisches ist was die Ausgabe betrifft. Sollte der Wahrheitswert von dieser Spalte noch für irgend etwas benötigt werden, dann würde ich das erst einmal als Spalte mit Wahrheitswerten belassen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das funktioniert bei mir gar nicht.
Das funktioniert:

Code: Alles auswählen

print(ds.to_string(formatters={'dL [%]': "{:.2%}".format, 'dR [%]': "{:.2%}".format}))
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

Bei mir funktioniert keine der zuletzt vorgeschlagenen .2%-Ausgaben.

Derzeitiger Stand:

Code: Alles auswählen

import pandas as pd

def fun(col1,col2):
        return abs(2*(col2-col1)/(col2+col1))
    
def paar(row):
    return "P" if row['dL [%]'] < 0.002 and row['dR [%]'] < .002 else "-"
   
df = pd.read_csv('neue_messung.csv',names=['ID','L [µH]','R [Ω]'],header=None)

#print(df)
#df['dL [%]'] = 0
#df['dR [%]'] = 0
#df['Paar']=""
#
# ds = sorted df

ds = df.sort_values(by='L [µH]')
ds['dL [%]']=fun(ds['L [µH]'],ds['L [µH]'].shift(1))
ds['dR [%]']=fun(ds['R [Ω]'],ds['R [Ω]'].shift(1))
#ds['dL [%]']=ds['dL [%]'].apply(lambda x:round(x,2))
#ds['dR [%]']=ds['dR [%]'].apply(lambda x:round(x,2))


#ds['Paar'] = ds.apply(paar, axis=1)
ds["Paar"] = ((ds["dL [%]"] < 0.2) & (ds["dR [%]"] < 2)).map({True: "P", False: "-"})
#ds.style.format({'dL [%]': "{:.2%}",'dR [%]': "{:.2%}"})
ds.to_string(formatters={'dL [%]': "{:.2%}".format, 'dR [%]': "{:.2%}".format})
val= ds['dL [%]'][1]
print (val)
ds

-------------------------------

 	ID 	L [µH] 	R [Ω] 	dL [%] 	dR [%] 	Paar
9 	81 	867.38 	12.91 	NaN 	NaN 	-
0 	52 	872.72 	12.66 	0.006138 	0.019554 	P
32 	40 	872.87 	12.60 	0.000172 	0.004751 	P
8 	29 	874.51 	12.43 	0.001877 	0.013584 	P
34 	86 	874.54 	12.52 	0.000034 	0.007214 	P
4 	19 	874.97 	12.71 	0.000492 	0.015061 	P
27 	61 	876.03 	12.43 	0.001211 	0.022275 	P
25 	89 	876.23 	12.70 	0.000228 	0.021488 	P
17 	32 	877.12 	12.41 	0.001015 	0.023098 	P
16 	80 	877.42 	12.55 	0.000342 	0.011218 	P
37 	79 	877.51 	12.48 	0.000103 	0.005593 	P
33 	38 	878.59 	12.43 	0.001230 	0.004014 	P
39 	59 	878.70 	12.39 	0.000125 	0.003223 	P
14 	33 	878.71 	12.57 	0.000011 	0.014423 	P

(Anm.: die "paar"-Funktion ist wegen der Einstellung auf %-Werte jetzt zu grob eingestellt, ist auch im Moment nicht wichtig. Den Tip mit dem Vorhalten der "Wahrheitswerte" werde ich noch übernehmen.)
--
Grüße
Christoph
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Krischu: Die `to_string()`-Methode wandelt den DataFrame in eine Zeichenkette. Man muss mit der Zeichenkette dann auch schon irgendetwas machen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Krischu
User
Beiträge: 97
Registriert: Dienstag 14. Januar 2014, 09:07

__blackjack__ hat geschrieben: Montag 19. Oktober 2020, 22:15 @Krischu: Die `to_string()`-Methode wandelt den DataFrame in eine Zeichenkette. Man muss mit der Zeichenkette dann auch schon irgendetwas machen.
Danke. Ja, hatte ich übersehen. Hatte das Beispiel nur aus einem Stackoverflow-Artikel rausgeholt.

Hier noch mal ein etwas eingedampfteres Beispiel:

Code: Alles auswählen

import pandas as pd

def fun(col1,col2):
        return abs(2*(col2-col1)/(col2+col1))
    
def paar(row):
    return "P" if row['dL'] < 0.002 and row['dR'] < .002 else "-"
   
#df = pd.read_csv('neue_messung.csv',names=['ID','L [µH]','R [Ω]'],header=None)

data=[(52,872.72,12.66),
(2,883.16,12.46),
(35,881.20,12.50),
(47,881.92,12.50),
(19,874.97,12.71)]

df = pd.DataFrame(data,columns=['ID','L','R'])

ds = df.sort_values(by='L')
ds['dL']=fun(ds['L'],ds['L'].shift(1))
ds['dR']=fun(ds['R'],ds['R'].shift(1))

ds["Paar"] = ((ds['dL'] < 0.2) & (ds['dR'] < 2)).map({True: "P", False: "-"})
ds.style.format({'dL': "{:.2%}",'dR': "{:.2%}"})

print(ds)
ds

-----------------------------

   ID       L      R        dL        dR Paar
0  52  872.72  12.66       NaN       NaN    -
4  19  874.97  12.71  0.002575  0.003942    P
2  35  881.20  12.50  0.007095  0.016660    P
3  47  881.92  12.50  0.000817  0.000000    P
1   2  883.16  12.46  0.001405  0.003205    P

	ID 	L 	R 	dL 	dR 	Paar
0 	52 	872.72 	12.66 	NaN 	NaN 	-
4 	19 	874.97 	12.71 	0.002575 	0.003942 	P
2 	35 	881.20 	12.50 	0.007095 	0.016660 	P
3 	47 	881.92 	12.50 	0.000817 	0.000000 	P
1 	2 	883.16 	12.46 	0.001405 	0.003205 	P

--
Grüße
Christoph
Antworten