2017-12-28 8 views
1

Ich habe mich mit der Suche nach einem Weg zur Erweiterung/Klonierung von Beobachtungszeilen auf der Basis einer vorgegebenen Anzahl und einer Gruppierungsvariablen (ID) beschäftigt. Für Kontext ist hier ein Beispiel Datenrahmen mit Pandas und Numpy (Python3).Erweitern Pandas Data Frame Zeilen basierend auf Nummer und Gruppen-ID (Python 3).

df = pd.DataFrame([[1, 15], [2, 20]], columns = ['id', 'num']) 

df 
Out[54]: 
    id num 
0 1 15 
1 2 20 

Ich möchte die Zeilen um die Zahl erweitern/klonen, die in der Variablen "num" basierend auf ihrer ID-Gruppe angegeben wird. In diesem Fall würde ich 15 Zeilen für ID = 1 und 20 Zeilen für ID = 2 haben. Das ist wahrscheinlich eine einfache Frage, aber ich habe Mühe, das zu schaffen. Ich habe mit Reindex und Repeat herumgespielt, aber die konzeptionellen Stücke passen nicht zusammen für mich.

In R, habe ich die expandRows Funktion im splitstackshape Paket gefunden, die wie folgt aussehen würde:

library(splitstackshape) 

df <- data.frame(id = c(1, 2), num = c(15, 20)) 


df 
    id num 
1 1 15 
2 2 20 


df2 <- expandRows(df, "num", drop = FALSE) 
df2 
    id num 
1  1 15 
1.1 1 15 
1.2 1 15 
1.3 1 15 
1.4 1 15 
1.5 1 15 
1.6 1 15 
1.7 1 15 
1.8 1 15 
1.9 1 15 
1.10 1 15 
1.11 1 15 
1.12 1 15 
1.13 1 15 
1.14 1 15 
2  2 20 
2.1 2 20 
2.2 2 20 
2.3 2 20 
2.4 2 20 
2.5 2 20 
2.6 2 20 
2.7 2 20 
2.8 2 20 
2.9 2 20 
2.10 2 20 
2.11 2 20 
2.12 2 20 
2.13 2 20 
2.14 2 20 
2.15 2 20 
2.16 2 20 
2.17 2 20 
2.18 2 20 
2.19 2 20 

wieder, sorry, wenn dies eine dumme Frage und Dank im Voraus für jede Hilfe ist.

+0

Keine dumme Frage. Ist der Index wichtig? Oder ist ein numerischer Index in Ordnung? –

Antwort

1

Ich kann Ihren Index nicht replizieren, aber ich kann replizieren Sie Ihre Werte mit np.repeat, ziemlich einfach in der Tat.

v = df.values 
df = pd.DataFrame(v.repeat(v[:, -1], axis=0), columns=df.columns) 
df 

    id num 
0 1 15 
1 1 15 
2 1 15 
3 1 15 
4 1 15 
5 1 15 
6 1 15 
7 1 15 
8 1 15 
9 1 15 
10 1 15 
11 1 15 
12 1 15 
13 1 15 
14 1 15 
15 2 20 
16 2 20 
17 2 20 
18 2 20 
19 2 20 
20 2 20 
21 2 20 
22 2 20 
23 2 20 
24 2 20 
25 2 20 
26 2 20 
27 2 20 
28 2 20 
29 2 20 
30 2 20 
31 2 20 
32 2 20 
33 2 20 
34 2 20 

Wenn Sie den genauen Index wollen (obwohl ich kann nicht sehen, warum Sie brauchen würde), dann würden Sie einen groupby Betrieb benötigen -

def f(x): 
    return x.astype(str) + '.' + np.arange(len(x)).astype(str) 

idx = df.groupby('id').id.apply(f).values 
idx 
array(['1.0', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '1.7', '1.8', 
     '1.9', '1.10', '1.11', '1.12', '1.13', '1.14', '2.0', '2.1', '2.2', 
     '2.3', '2.4', '2.5', '2.6', '2.7', '2.8', '2.9', '2.10', '2.11', 
     '2.12', '2.13', '2.14', '2.15', '2.16', '2.17', '2.18', '2.19'], dtype=object) 

Weisen Sie idx dem df Index zu -

df.index = idx 
+1

Ich adressiere sowohl Ihren Kommentar als auch die Lösung: 1) Kommentar: Die genauen Indexzahlen sind in diesem Fall nicht wichtig. Ich sollte schneller reagieren, damit du nicht extra arbeiten musst, aber es sieht gut aus! 2) Hauptlösung: Ich konnte es mit einer kleinen Anpassung auf meine Daten anwenden und es funktioniert perfekt. Ich danke dir sehr! Die Antwort war ziemlich einfach im Vergleich zu dem, was ich versuchte. – cbesaw

Verwandte Themen