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?

Michael Hooreman
quelle

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...

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

df.columns = pd.MultiIndex.from_tuples(columns)
Leopold
quelle
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

Trenton
quelle
-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)
Sieger
quelle