in df Einheiten den Größen zuordnen

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
Progressive
User
Beiträge: 16
Registriert: Dienstag 25. Juni 2019, 05:43

Hi,

ich habe ein großes df, wo insg. 62 sich wiederholende physikalische Parameter enthalten sind. Die Einheiten dieser sind allerdings nur sechs und ich suche gerade nach einer klugen Methode, wie ich die Größen den Einheiten zuordnen kann, ohne, dass ich jede manuell durchgucken muss.
np.unique(df["dataobjectname"])

array(['A_phsA', 'A_phsB', 'A_phsC', 'AbsReactPh1', 'AbsReactPh2',
'AbsReactPh3', 'AgeRte', 'AirMstLTCWrn', 'AirMstTnkWrn', 'BotTmp',
'CurStGr1', 'CurStGr2', 'DfAlg', 'DfFail', 'DvDfPh1',
'DvDfPh2', 'DvDfPh3', 'EndPosL', 'EndPosR', 'EnvTmp', 'FuncMon',
'GasInsAlm', 'GasInsTr', 'HPTmpClc', 'LTCBlk',
'LTCTmp', 'Loc', 'MDSIR', 'MDSIRFc', 'MOLTC', 'MOLTCFc', 'MOLTCR',
'MOLTCRFc', 'MOilSmp', 'MSelIns', 'MSelInsFc', 'MotCon', 'MotDrv',
'MotPro', 'OilLvH2LTC', 'OilLvH2PTR', 'OilLvL2LTC', 'OilLvL2PTR',
'OpCntRs', 'PPV_phsAB', 'PPV_phsBC', 'PPV_phsCA', 'PhyHealth',
'PresVlvStLTC', 'PresVlvStPTR', 'ProRly', 'ReactAlg', 'ReactFail',
'ReactPh1', 'ReactPh2', 'ReactPh3', 'RlAgeRte', 'SetActErrGr1',
'SetActErrGr2', 'TapOpErr', 'TapPos', 'TopTmp'], dtype=object)
df["unit"].value_counts()

Ampere 12708606
PartsPerMillion 922259
Farad 663434
Volt 608920
Percent 497151
Celsius 284124
Name: unit, dtype: int64
df

deviceid dataobjectname aggregation timestamp assetname charttype datatype folderid qualityratio unit value
1127536 BM11012 AbsReactPh1 mean_900000 2018-10-26 02:30 2 S2 Line Double 1 0.329936 Farad 2.370000e-10
1127537 BM11012 AbsReactPh1 mean_900000 2018-10-26 00:15 2 S2 Line Double 1 0.966661 Farad 2.370000e-10
1127538 BM11012 AbsReactPh1 mean_900000 2018-10-25 18:15 2 S2 Line Double 1 1.000000 Farad 2.370111e-10
(...)
Die Größen kriege ich ja relativ leicht durch

Code: Alles auswählen

sizes = np.unique(df["dataobjectname"])
aber wie ordne ich denen jetzt die richtige Einheit zu?
Naiv würde ich es mit einer umständlichen Abfrage machen, á la

Code: Alles auswählen

size_unit_dict = {}

for i in range(df):
    for j in range(size)
        if(df["dataobjectname"][i] == size[j]): size_unit_dict[j] = df["unit"][i]
So in etwa, vor allem, wie man da auf ein dictionary zugreift müsste ich mir im Detail erstmal angucken.
So jedenfalls würde ich es machen, was mir recht umständlich erscheint. Ich bin zwar gerade erst frisch zu python gewechselt, würde aber gerne von Anfang an lesbar & elegant programmieren. Daher: Hat jemand eine schönere Lösung?
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Progressive:: Du suchst `drop_duplicates()`:

Code: Alles auswählen

In [31]: df
Out[31]: 
   x  y  z
0  a  A  1
1  b  B  2
2  a  A  3

In [32]: df[['x', 'y']].drop_duplicates()
Out[32]: 
   x  y
0  a  A
1  b  B
Danach würde ich noch prüfen ob die Länge des Ergebnisses gleich der Länge der eindeutigen Objektnamen ist, um sicherzustellen das tatsächlich eine 1:1 Zuordnung besteht. Wobei `Series`-Objekt bereits eine `unique()`-Methode haben – da braucht man nicht `numpy.unique()` für nehmen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Progressive
User
Beiträge: 16
Registriert: Dienstag 25. Juni 2019, 05:43

Stark, genau danach habe ich gesucht.. vielen Dank!
Antworten