Seite 1 von 1

Aus dict den key mit der längsten series finden und alle items mit dieser Länge filtern

Verfasst: Dienstag 2. Juli 2019, 08:23
von saibot9393
Hallo ich bin Python Anfänger und würde mich über Hilfe freuen!

Es geht um folgendes: Ich möchte aus einer Anzahl von keys aus dict, den key finden, mit der längsten series mit den meisten items. Danach möchte ich genau diese items filtern und in eine neue Excel Datei einfügen. Leider komme ich seit einigen Tagen einfach nicht weiter.. Vielen Dank schonmal im Voraus für jede Hilfe!

import glob
from os.path import basename
import operator
import numpy as np
import pandas as pd

files = glob.glob('Temperatur/*.dat')
writer = pd.ExcelWriter(Temperatur.xlsx', engine='xlsxwriter')
for file in files:
sheet_name = basename(file)
sheet_name = str(sheet_name.split('_', 1)[0][1:])

with open(file, 'r') as f:
l = f.readlines()

bin_files = []
for line in l:
row = line.strip().split(',')
num = row[0]
if num == '211':
# print(row[1])
bin_files.append(row[1])

vars = {}
for name in bin_files:
stem, ext = name.rsplit('.', 1)
assert ext in ['R32', 'R64'], 'Unknown data format'
if ext == 'R32':
values = np.fromfile('temperatur' + '/' + name, dtype=np.float32)
else:
values = np.fromfile('temperatur + '/' + name, dtype=np.float64)
var_name = stem.split('_', 10)[-1]
vars[var_name] = values

# filter keys with longest series
# 1) find longest series with x items
max(vars.items(), key=operator.itemgetter(1))[0]

# 2) filter all items with series length x
def by_size(vars, max):
result = []
for values in vars:
if len(values) == max:
result.append(values)
return result

df = pd.DataFrame.from_dict(values)
df.to_excel(writer, sheet_name=sheet_name, index=False, header=None)

writer.save()
writer.close()


Beim Compilieren bekomme ich folgende Fehlermeldung:

ValueError: operands could not be broadcast together with shapes (12,) (13,)

Re: Aus dict den key mit der längsten series finden und alle items mit dieser Länge filtern

Verfasst: Dienstag 2. Juli 2019, 09:55
von Sirius3
Das was Du da unter dem Kommentaren filter beschreibst, ist quatsch. `max` ist eine Funktion, mit dem Rückgabewert machst Du aber nichts. `by_size` ist auch eine Funktion, die aber nie aufgerufen wird.
Ins Excel werden die Values der letzten Datei geschrieben.

Wenn Du Fehler bekommst, bitte den kompletten Traceback posten, sonst muß man Raten, wo der Fehler auftritt.

Dinge aus os.path importiert man normalerweise nicht direkt. str.split liefert schon eine Liste mit Strings, daraus ein Element nochmal in einen String umzuwandeln ist unnötig. Du benutzt relative Verzeichnisse und zwar einmal Temperatur und einmal temperatur, solche expliziten Strings sollte man als Konstanten am Anfang definieren. Pfade setzt man nicht mit + zusammen, dafür gibt es os.path.join.
Das Lesen der Values unterscheidet sich nur im dtype. Den solltest Du als Variable definieren, dass es nur einmal fromfile im Code gibt. Am einfachsten über ein Wörterbuch, dann hast Du die Prüfung auf die Extension gleich integriert.

Re: Aus dict den key mit der längsten series finden und alle items mit dieser Länge filtern

Verfasst: Dienstag 2. Juli 2019, 11:21
von __blackjack__
Der Code kommt so bekannt vor. Ich habe hier doch schon mal einiges dazu geschrieben: viewtopic.php?f=1&t=45819