2016-04-09 13 views
1

Ich habe einen Pandas Datenrahmen (df), die wie folgt aussieht:Wie du Gruppen von Reihen in Pandas basierend auf der Anzahl in der Spalte duplizierst?

+----------------------------- + 
| aid | bid | x1 | x2 | count | 
+----------------------------- + 
| 1 | 1 | tim | 6 | 3  | 
| 1 | 2 | tim | 6 | 3  | 
| 1 | 3 | tim | 6 | 3  | 
| 2 | 1 | bob | 6 | 2  | 
| 2 | 2 | bob | 6 | 2  | 
| 2 | 3 | bob | 6 | 2  | 
+----------------------------- + 

Ich brauche einen neuen Datenrahmen zu erzeugen, wobei jede Gruppe (gruppiert auf ‚Hilfe‘) durch die Anzahl der ‚count dupliziert ' Säule. Es sollte wie folgt aussehen:

+----------------------------- + 
| aid | bid | x1 | x2 | count | 
+----------------------------- + 
| 1 | 1 | tim | 6 | 3  | 
| 1 | 2 | tim | 6 | 3  | 
| 1 | 3 | tim | 6 | 3  | 
| 1 | 1 | tim | 6 | 3  | 
| 1 | 2 | tim | 6 | 3  | 
| 1 | 3 | tim | 6 | 3  | 
| 1 | 1 | tim | 6 | 3  | 
| 1 | 2 | tim | 6 | 3  | 
| 1 | 3 | tim | 6 | 3  | 
| 2 | 1 | bob | 6 | 2  | 
| 2 | 2 | bob | 6 | 2  | 
| 2 | 3 | bob | 6 | 2  | 
| 2 | 1 | bob | 6 | 2  | 
| 2 | 2 | bob | 6 | 2  | 
| 2 | 3 | bob | 6 | 2  | 
+----------------------------- + 

Ich kann das nicht scheinen, um die Split-apply-kombinieren Methoden in Pandas arbeiten mit.

Ich bin in der Lage, die Gruppen df.groupby ('Hilfe', sort = False) zu teilen, aber kann diesen Schritt nicht passieren. danke für jede Hilfe.

AKTUALISIERT: Beide Antworten von B.M. und Alexander arbeitete mit den von mir bereitgestellten Beispieldaten. Ich habe später erfahren, dass die von mir bereitgestellten Daten nicht realistisch genug waren, um mit meinen realen Daten zu arbeiten. Lassen Sie mich einen aktualisierten Datensatz bereitstellen.

Jetzt, wenn ich Alexanders Lösung laufen lasse, bekomme ich die Ausgabe unten gezeigt. Ich muss die Ausgabe zuerst nach "Hilfe" und dann nach "Gebot" sortiert haben, wobei das Gebot immer 1,2,3 wiederholt, während der Wert von X2, der diesem Gebot zugeordnet war, in den Originaldaten beibehalten wird, bevor die Gruppen aus drei Zeilen dupliziert werden.

pd.concat([frame 
      for count, frame in df.groupby('count', as_index=False,sort=False) 
      for _ in range(count)]).sort_values('aid').reset_index(drop=True) 

    aid bid x1 x2  count 
0  1 1 tim 1  3 
1  1 2 tim 0  3 
2  1 3 tim 0  3 
3  1 1 tim 1  3 
4  1 2 tim 0  3 
5  1 3 tim 0  3 
6  1 1 tim 1  3 
7  1 2 tim 0  3 
8  1 3 tim 0  3 
9  2 3 bob 0  2 
10 2 1 bob 0  2 
11 2 2 bob 1  2 
12 2 2 bob 1  2 
13 2 1 bob 0  2 
14 2 3 bob 0  2 
15 3 2 ray 0  4 
16 3 1 ray 0  4 
17 3 2 ray 0  4 
18 3 3 ray 1  4 
19 3 1 ray 0  4 
20 3 2 ray 0  4 
21 3 3 ray 1  4 
22 3 1 ray 0  4 
23 3 2 ray 0  4 
24 3 3 ray 1  4 
25 3 1 ray 0  4 
26 3 3 ray 1  4 

In dieser Ausgabe, die es richtig für die ersten ‚Angebot‘ Beobachtungen sortiert (dh 1,2,3,1,2,3 ...), aber dann auseinander die Bestellung fällt weiter nach unten. Es muss kleine Verbesserungen geben, die ich vermisse. Ich schätze wirklich alle weiteren Gedanken dazu.

Anhand des Beispiels von B.M. es liefert die richtige Antwort, sortiert nach dem sich wiederholenden "Gebot" (dh 1,2,3,1,2,3 ...), aber dann ist es verloren, wenn nach 'Hilfe' sortiert wird.

Vielen Dank für Vorschläge, wie Sie dies beheben können.

Antwort

0

Sie verketten können eine Liste Verständnis mit:

df = pd.DataFrame({'aid': [1,1,1,2,2,2], 'bid': [1,2,3,1,2,3], 'x1': ['tim']*3 + ['bob']*3, 'x2': [6]*6, 'count': [3,3,3,2,2,2]})[['aid', 'bid', 'x1', 'x2', 'count']] 

>>> pd.concat([frame 
       for count, frame in df.groupby('count', as_index=False, sort=False) 
       for _ in range(count)]).sort_values('aid').reset_index(drop=True) 
    aid bid x1 x2 count 
0  1 1 tim 6  3 
1  1 2 tim 6  3 
2  1 3 tim 6  3 
3  1 1 tim 6  3 
4  1 2 tim 6  3 
5  1 3 tim 6  3 
6  1 1 tim 6  3 
7  1 2 tim 6  3 
8  1 3 tim 6  3 
9  2 1 bob 6  2 
10 2 2 bob 6  2 
11 2 3 bob 6  2 
12 2 1 bob 6  2 
13 2 2 bob 6  2 
14 2 3 bob 6  2 
0
out=pd.DataFrame() 
for n,fr in df.groupby('count'): out=out.append([fr]*n) 

für

In [5]: out.sort('aid') 
Out[5]: 
    aid bid x1 x2 count 
0 1 1 tim 6  3 
1 1 2 tim 6  3 
2 1 3 tim 6  3 
0 1 1 tim 6  3 
1 1 2 tim 6  3 
2 1 3 tim 6  3 
0 1 1 tim 6  3 
1 1 2 tim 6  3 
2 1 3 tim 6  3 
3 2 1 bob 6  2 
4 2 2 bob 6  2 
5 2 3 bob 6  2 
3 2 1 bob 6  2 
4 2 2 bob 6  2 
5 2 3 bob 6  2 
Verwandte Themen