Seite 2 von 2

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

Verfasst: Montag 19. Oktober 2020, 09:45
von Krischu
Moment....

Ja, danke. Funktioniert wunderbar.

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

Verfasst: Montag 19. Oktober 2020, 10:39
von __blackjack__
@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.

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

Verfasst: Montag 19. Oktober 2020, 10:42
von Sirius3
Das funktioniert bei mir gar nicht.
Das funktioniert:

Code: Alles auswählen

print(ds.to_string(formatters={'dL [%]': "{:.2%}".format, 'dR [%]': "{:.2%}".format}))

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

Verfasst: Montag 19. Oktober 2020, 22:09
von Krischu
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.)

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

Verfasst: Montag 19. Oktober 2020, 22:15
von __blackjack__
@Krischu: Die `to_string()`-Methode wandelt den DataFrame in eine Zeichenkette. Man muss mit der Zeichenkette dann auch schon irgendetwas machen.

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

Verfasst: Montag 19. Oktober 2020, 22:53
von Krischu
__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