Pandas: Wie kann ich mehrstufige Spalten erstellen?


8

Ich habe einen Pandas DataFrame mit folgenden Spalten:

n_0
n_1
p_0
p_1
e_0
e_1

Ich möchte es in Spalten und Unterspalten umwandeln:

0
    n
    p
    e
1
    n
    p
    e

Ich habe in der Dokumentation gesucht und bin völlig verloren, wie ich dies implementieren soll. Hat jemand irgendwelche Vorschläge?

Antworten:


1

Endlich habe ich eine Lösung gefunden.

Das Beispielskript finden Sie unten.

#!/usr/bin/env python3
import pickle
import pandas as pd
import itertools
import numpy as np

data = pd.DataFrame(np.random.randn(10, 5), columns=('0_n', '1_n', '0_p', '1_p', 'x'))

indices = set()
groups = set()
others = set()
for c in data.columns:
    if '_' in c:
        (i, g) = c.split('_')
        c2 = pd.MultiIndex.from_tuples((i, g),)
        indices.add(int(i))
        groups.add(g)
    else:
        others.add(c)
columns = list(itertools.product(groups, indices))
columns = pd.MultiIndex.from_tuples(columns)
ret = pd.DataFrame(columns=columns)
for c in columns:
    ret[c] = data['%d_%s' % (int(c[1]), c[0])]
for c in others:
    ret[c] = data['%s' % c]
ret.rename(columns={'total': 'total_indices'}, inplace=True)

print("Before:")
print(data)
print("")
print("After:")
print(ret)

Das tut mir leid...


1
columns=[('0', 'n'), ('0', 'p'), ('0', 'e'), ('1', 'n'), ('1', 'p'), ('1', 'e')]

df.columns = pd.MultiIndex.from_tuples(columns)

Dies ändert nichts am vorhandenen Datenrahmen.
Stephen Rauch

@StephenRauch Fügt dem vorhandenen Datenrahmen mehrstufige Spalten hinzu. Willst du das nicht?
Leopold

Die Frage betraf die Transformation eines vorhandenen Datenrahmens.
Stephen Rauch

Ja, der df in df.columns ist Ihr vorhandener Datenrahmen. Versuch es.
Leopold

Ähm, ich muss es nicht versuchen, da ich mit Pandas sehr vertraut bin. Ihr Code ist eine fest codierte Lösung. Es wird KEIN Versuch unternommen, den vorhandenen Datenrahmen zu betrachten. Wenn die Spaltennamen unterschiedlich sind, funktioniert Ihr Code NICHT.
Stephen Rauch

0

Ich musste die Sortierung des Siegers anpassen, um das spezifische Spaltenformat von OP zu erhalten:

df = df.sort_index(level=0, axis=1)

0 1 e n p e n p 0 -0.995452 -3.237846 1.298927 -0.269253 -0.857724 -0.461103


-2

Es gibt eine einfachere Lösung:

  data.columns = data.columns.str.split('_', expand=True)

Um Spaltennamen anzuordnen, kann man auch Folgendes tun:

 data.sort_index(axis=1, inplace=True)

So ändern Sie die Spaltenebenen:

 data = data.reorder_levels([1,0], axis=1)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.