Panda Series MultiFrame zu Singleframe konvertieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

Hi,

ich lasse mir die Häufigkeitsverteilung einer Abweichung bestimmen:

Code: Alles auswählen

verteilungen_abweichungen_von_hfgster_schrittweite = pd.DataFrame(abweichungen_von_hfgster_schrittweite).value_counts()
Die Ausgabe

Code: Alles auswählen

print("verteilung: ")
print(verteilungen_abweichungen_von_hfgster_schrittweite)
print("")
print("keys: ")
print(verteilungen_abweichungen_von_hfgster_schrittweite.keys())
sieht folgend aus:
Bild


Das Output von pd.value_counts() ist also eine Series, wobei die Keys Multiframes sind, der 2. Eintrag eines jeden Tuples aber leer ist; das ist schlecht für mich. Wie kann ich aus diesem MultiFrame effizient einen Singleframe, lediglich mit dem ersten Eintrag jeweils erstellen?

Habe einiges probiert, nichts war erfolgreich; momentane Schlamperlösung ist die Umformung in eine Liste und daraus mit List-Comprehension immer nur den 1. Eintrag zu wählen.

Wie geht es sauber?
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Es gibt bestimmt mehrere (und bessere) Möglichkeiten.
Mir ist die hier eingefallen:

Code: Alles auswählen

import pandas as pd

data = [1,2,3,4,5,6,2,3,1,5,8,3,6,2,1,3,4,2,5,6,8,2,3,4,1,2,3]
counts = pd.DataFrame(data).value_counts()
keys = counts.keys()

def mapper(item):
    return item[0]

list(keys.map(mapper))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

ThomasL hat geschrieben: Sonntag 13. Februar 2022, 17:42 Es gibt bestimmt mehrere (und bessere) Möglichkeiten.
Mir ist die hier eingefallen:

Code: Alles auswählen

import pandas as pd

data = [1,2,3,4,5,6,2,3,1,5,8,3,6,2,1,3,4,2,5,6,8,2,3,4,1,2,3]
counts = pd.DataFrame(data).value_counts()
keys = counts.keys()

def mapper(item):
    return item[0]

list(keys.map(mapper))

danke dir! finde ich sehr gut
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Man könnte sich von dem `MultiIndex` auch einfach vom entsprechenden Level die Werte geben lassen:

Code: Alles auswählen

In [22]: counts
Out[22]: 
3    6
2    6
1    4
6    3
5    3
4    3
8    2
dtype: int64

In [23]: counts.index                                                           
Out[23]: 
MultiIndex([(3,),
            (2,),
            (1,),
            (6,),
            (5,),
            (4,),
            (8,)],
           )

In [24]: counts.index.get_level_values(0)                                       
Out[24]: Int64Index([3, 2, 1, 6, 5, 4, 8], dtype='int64', name=0)

In [25]: list(counts.index.get_level_values(0))                                 
Out[25]: [3, 2, 1, 6, 5, 4, 8]
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__blackjack__ hat geschrieben: Montag 14. Februar 2022, 13:28 Man könnte sich von dem `MultiIndex` auch einfach vom entsprechenden Level die Werte geben lassen:

Code: Alles auswählen

In [22]: counts
Out[22]: 
3    6
2    6
1    4
6    3
5    3
4    3
8    2
dtype: int64

In [23]: counts.index                                                           
Out[23]: 
MultiIndex([(3,),
            (2,),
            (1,),
            (6,),
            (5,),
            (4,),
            (8,)],
           )

In [24]: counts.index.get_level_values(0)                                       
Out[24]: Int64Index([3, 2, 1, 6, 5, 4, 8], dtype='int64', name=0)

In [25]: list(counts.index.get_level_values(0))                                 
Out[25]: [3, 2, 1, 6, 5, 4, 8]
so etwas habe ich bereits versucht, da bekomme ich allerdings nur die meldung
" AttributeError: 'MultiIndex' object has no attribute 'index' "
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@G-Rizzle: Das ist ja 1:1 aus einer Python-Sitzung raus kopiert, das funktioniert also. Du versuchst offenbar auf einem `MultiIndex` noch mal auf den Index zuzugreifen, den ein Index halt nicht hat, der ist ja schon der Index und hat keinen.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten