Hallo,
Um mein Problem genauer zu schildern möchte ich ein Beispiel aufzeigen
Ich bekomme ein Excel sheet, dass ich in ein Dataframe wandle.
Das sieht folgendermassen aus:
df1:
Module Name Region Name Current
aaa FLASH 99
aaa ARAM 88
bbb FLASH 77
ccc ARAM 66
ccc FLASH 55
ccc BRAM 44
Am ende brauche ich folgendes Dataframe:
df2:
Module Name FLASH RAM
aaa 99 88
bbb 77 0
ccc 55 66+44
Ich hätte es mit einer for schleife gemacht. Leider ist das nicht so erwünscht. Ich komme auf keine andere Lösung. Alles was ich bisher gefunden habe geben mir neue Dataframes.
Das nächste Problem ist dass ich keinen Ansatz hab, wie ich im Dataframe suche, in einer Spalte 'Region Name' nach einen enthaltenen string 'RAM'. Diese sollen dann addiert werden wenn der Module Name von beiden übereinstimmt. Wie gesagt ich habe hier nicht einmal ein Ansatz und was ich im Netz suchen soll.
Vielen Dank schon mal
Dataframes neu ordnen und bestimmte Sachen addieren
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@python_student: Bevor Du irgendwo im Netz suchst würde ich ja erst einmal in der Pandas-Dokumentation nachlesen bzw. das Benutzerhandbuch dort durcharbeiten.
Wenn Du DataFrame-Inhalte zeigst wäre es gut wenn die in einer Form wären die man leicht in einen tatsächlichen DataFrame überführen kann.
Und man müsste jetzt raten wie der `df2` zustande kommt.
Wenn Du DataFrame-Inhalte zeigst wäre es gut wenn die in einer Form wären die man leicht in einen tatsächlichen DataFrame überführen kann.
Und man müsste jetzt raten wie der `df2` zustande kommt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 23
- Registriert: Samstag 22. Februar 2020, 13:02
sorry meine Tabellen war hier schlecht dargestellt bin aber selbst auf eine Lösung gekommen und zwar mit den Funktionen 'groupby' und 'agg'.
-
- User
- Beiträge: 512
- Registriert: Mittwoch 13. November 2019, 08:38
Leider ist deine Beschreibung hier tatsächlich nicht ganz eindeutig. Aus dem vorherigen Thread schließe ich aber mal, dass du sowas willst:
Was passiert hier? Zunächst werden die Reihen ausgewählt deren Inhalt in der Spalte `Region Name` 'FLASH' enthält. Von dieser Auswahl werden nur die Spalten `Module Name` und `Current` selektiert. Diese werden nach dem `Module Name` gruppiert und aufsummiert und anschließend sinnvoll benannt. Das gleiche geschieht für den RAM. Dann werden die beiden Gruppen wieder zu einem DataFrame zusammengefügt.
Edit: Oh, habe deine Antwort überblättert. Schön, dass du es hinbekommen hast.
Code: Alles auswählen
import pandas as pd
df = pd.DataFrame({'Module Name': ['aaa', 'aaa', 'bbb', 'ccc', 'ccc', 'ccc'],
'Region Name': ['FLASH', 'ARAM', 'FLASH', 'ARAM', 'FLASH', 'BRAM'],
'Current': [99, 88, 77, 66, 55, 44]})
print(df, '\n')
df_flash = df[df['Region Name'].str.contains('FLASH')][['Module Name', 'Current']]
df_flash = df_flash.groupby('Module Name').sum()
df_flash = df_flash.rename(columns={'Current': 'FLASH'})
print(df_flash, '\n')
df_ram = df[df['Region Name'].str.contains('RAM')][['Module Name', 'Current']]
df_ram = df_ram.groupby('Module Name').sum()
df_ram = df_ram.rename(columns={'Current': 'RAM'})
print(df_ram, '\n')
df2 = df_flash.merge(right=df_ram, how='outer', on='Module Name')
print(df2)
Edit: Oh, habe deine Antwort überblättert. Schön, dass du es hinbekommen hast.
Einfacher geht das mit `pivot`:
Code: Alles auswählen
df2 = df.pivot(index='Module Name', columns='Region Name')['Current']
-
- User
- Beiträge: 512
- Registriert: Mittwoch 13. November 2019, 08:38
Guter Hinweis, danke dafür. Dabei werden jedoch alle Werte in `Region Name` zu einer Spalte. Kennst du eine schlanke Möglichkeit das zu verhindern und die '*RAM'-Reihen zusammenzufassen?
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das hier war gestern mein Ergebnis:
Code: Alles auswählen
#!/usr/bin/env python3
from io import BytesIO
import pandas as pd
DATA = b"""\
Module Name Region Name Current
aaa FLASH 99
aaa ARAM 88
bbb FLASH 77
ccc ARAM 66
ccc FLASH 55
ccc BRAM 44
"""
def main():
df = pd.read_csv(
BytesIO(DATA), index_col="Module Name", sep="\s\s+", engine="python"
)
print(df)
flash_mask = df["Region Name"] == "FLASH"
flash_data = df[flash_mask].drop(columns="Region Name")
flash_data.columns = ["FLASH"]
print(flash_data)
ram_data = (
df[~flash_mask]
.drop(columns="Region Name")
.groupby("Module Name")
.agg("sum")
)
ram_data.columns = ["RAM"]
print(ram_data)
result = flash_data.join(ram_data).fillna(0)
print(result)
if __name__ == "__main__":
main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 23
- Registriert: Samstag 22. Februar 2020, 13:02
Vielen dank wiedermal für die Hilfe. Ihr seid spitze!!!!
@__blackjack__ Dieser Abschnitt funktioniert bei mir nicht:
folgende Fehlermeldung:
ValueError: Length mismatch: Expected axis has 3 elements, new values have 1 elements
Ich denke es liegt da dran das von meinen Importierten Daten der Zeilenindex mit 0 1 2 3 ... beschriftet ist und nicht mit 'Module Name'
Ich habe es folgendermassen gemacht, wahrscheinlich wieder einmal sehr umständlich und schlecht
. Es war eine Codekombination von __blackjack__ und einfachTobi.
Ich könnte es definitiv so importieren wie du __blackjack__ mit:
index_col="Module Name"
Aber dann hätte ich das Problem, dass mein Index 'Module Name' verschlungen wird wenn ich ein excel erzeuge mit to_excel.
Kann man das irgendwie wieder aus dem Index rausziehen?
@__blackjack__ Dieser Abschnitt funktioniert bei mir nicht:
Code: Alles auswählen
flash_data.columns = ["FLASH"]
ValueError: Length mismatch: Expected axis has 3 elements, new values have 1 elements
Ich denke es liegt da dran das von meinen Importierten Daten der Zeilenindex mit 0 1 2 3 ... beschriftet ist und nicht mit 'Module Name'
Ich habe es folgendermassen gemacht, wahrscheinlich wieder einmal sehr umständlich und schlecht

Code: Alles auswählen
flash_mask = df["Region Name"] == "FLASH
flash_data = df[flash_mask].drop(columns="Region Name")
flash_data.rename(columns={'Current': 'FLASH'}, inplace=True)
ram_data = (
df[~flash_mask]
.drop(columns="Region Name")
.groupby(["Module Name"], as_index=False)
.agg("sum")
)
ram_data['RAM'] = 1
ram_data['RAM'] = ram_data['Current']
ram_data = ram_data.drop(columns='Current')
df2 = flash_data.merge(right= ram_data, how='outer', on='Module Name')
index_col="Module Name"
Aber dann hätte ich das Problem, dass mein Index 'Module Name' verschlungen wird wenn ich ein excel erzeuge mit to_excel.
Kann man das irgendwie wieder aus dem Index rausziehen?