Liste mit gleichen Einträgen als Header für DataFrame verwenden.

MisterY

Urgestein
Thread Starter
Mitglied seit
17.03.2007
Beiträge
2.782
Hi,

ich habe eine Liste die folgendes enthält:

col_result = ['A', 'x', 'B', 'x', 'C', 'x']

diese Liste würde ich gerne als Header in Pandas verwenden:


df = pd.read_csv(file, sep='\t', names = col_result, index_col=False).

Jedoch bekomme ich da immer den Fehler:

ValueError: Duplicate names are not allowed.


Hat da einer eine Idee??
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Pandas stört sich an deinen duplicates. In diesem Fall 3x das x.

Steht übrigens auch in der Doku:
names array-like, default None
List of column names to use. If file contains no header row, then you should explicitly pass header=None. Duplicates in this list are not allowed.
 
Ja das war mir bewusst. Ich habe aber ne Methode gefunden, wie es dennoch geht :coolblue:
 
Das gute an Communities ist, das man die Lösung auch teilen kann.
 
hatte ich eigentlich auch vor, habe es aber vergessen :fresse2:

"x" war in meinem Fall der 2SD einer Messung (Großbuchstaben). die mit "##<--" markierten Zeilen sind die notwendigen.

Code:
## Zunächst header manipulieren:
df2sd = dfSamples.groupby('Filename')[d_cols].std(ddof = 0) * 2
new_names_sd = [(i,'2SD+' + i) for i in df2sd.iloc[:, 0:].columns.values] ##<-- hier wird 2SD eingefügt, aber mit einem Sonderzeichen dahinter. Keine Ahnung warum das notwendig war.
df2sd.rename(columns = dict(new_names_sd), inplace = True) ## <---
df2sd_round = np.round(df2sd, 3)
results = pd.concat([deltaresults_round, df2sd_round], axis = 1)
results = results[[item for items in zip(results_round.columns, df2sd_round.columns) for item in items]]

df_mean = np.round(df.groupby('Filename')['Messung'].mean(), 3)
df_2sd = np.round(df.groupby('Filename')['Messung'].std(ddof = 0) * 2, 3)
df_2sd = df_2sd.rename('2SD') ##<--

results = pd.concat([results, df_mean], axis = 1)
results = pd.concat([results, df_2sd], axis = 1)

col_result = list(results.columns)
col_result = [l.replace('_','') for l in col_result]
col_result = [i.split('+', 1)[0] for i in col_result] ##<-- hier wird das Sonderzeichen wieder entfernt.


## insert new header
reread = pd.read_csv(resultfile, sep='\t', index_col=False)
reread.columns = col_result
reread.columns = reread.columns.str.replace('2SD', '2SD')##<--

Sicherlich nicht elegant, aber funktioniert. Programmiere auch erst seit einem guten Monat. Ich weiß nicht wie es euch geht, aber das war ne sehr steile Lernkurve :fresse2: mit viel Trial and Error :wut: aber immerhin funktioniert das Programm inklusive Multiprocessing :banana:
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh