2017-06-12 6 views
0

Mein ursprünglicher Datenrahmen:Pandas - Einfügen von Zeilen basierend off-Wert

site code  type name 
0 a  code_foo s 
1 a  code_foo t 
2 b  code_foo s 
3 b  code_foo t 

Wunscher:

site code  type name 
0 a  code_foo s  1 
1 a  code_foo s  2 
2 a  code_foo s  3 
3 a  code_foo s  All 
4 a  code_foo t 
5 b  code_foo s  1 
6 b  code_foo s  2 
7 b  code_foo s  3 
8 b  code_foo s  All 
9 b  code_foo t 

Ich würde im Grunde wie der Datenrahmen, wo ändern: df [ 'type'] == 's', weisen Sie df ['name'] == 1 zu und fügen Sie drei weitere Zeilen mit den Werten 2, 3 und All ein.

Antwort

0

Sie können zunächst einen Typnamen df erstellen und dann mit dem ursprünglichen DF verknüpfen und nach Site sortieren.

df2=pd.DataFrame({'name': {0: 1, 1: 2, 2: 3, 3: 'all'}, 
'type': {0: 's', 1: 's', 2: 's', 3: 's'}}) 

pd.merge(df[['site','code','type']],df2,on='type',how='outer') 
    .sort_values(by=['site','name']) 
    .fillna('') 
Out[43]: 
    site  code type name 
0 a code_foo s 1 
1 a code_foo s 2 
2 a code_foo s 3 
3 a code_foo s all 
8 a code_foo t  
4 b code_foo s 1 
5 b code_foo s 2 
6 b code_foo s 3 
7 b code_foo s all 
9 b code_foo t 
0

Sie können die neuen Zeilen zu Ihrer Datenrahmen als Duplikate der 's' Zeilen hinzufügen und dann die 'name' Spalte mit den Werten füllen Sie wollen:

Erste hinzufügen 3 doppelte Zeilen für jede Zeile, die type Wert ist, ist 's'. Sortieren Sie dann nach site und type, damit Sie die ursprüngliche Reihenfolge beibehalten.

df2 = df.append([df[df.type == 's']]*3, ignore_index=True).sort_values(['site', 'type']) 

Stellen Sie alle Werte in der name Spalte auf die leere Zeichenfolge (wir diesen Wert für die 's' Zeilen im nächsten Schritt überschreiben)

df2['name'] = '' 

eine Liste erstellen, in dem [1, 2, 3, 'All'] wiederholt n-mal, wobei n die Anzahl der ursprünglichen 's' Zeilen ist.

name_vals = [1, 2, 3, 'All']*len(df.loc[df2.type == 's']) 

Assign Diese Liste als die Werte in der name Spalte für alle Zeilen, die Art ist, ist 's'. Da sie bereits sortiert sind, werden die Werte dort platziert, wo Sie sie haben möchten.

df2.loc[df2.type == 's', 'name'] = name_vals 

Der Index an dieser Stelle ein wenig vermasselt wird also, wenn Sie mögen, es zurücksetzen:

df2.reset_index(drop=True, inplace=True) 

und die neuen Datenrahmen wie folgt aussehen:

site  code type name 
0 a code_foo s 1 
1 a code_foo s 2 
2 a code_foo s 3 
3 a code_foo s All 
4 a code_foo t  
5 b code_foo s 1 
6 b code_foo s 2 
7 b code_foo s 3 
8 b code_foo s All 
9 b code_foo t  
Verwandte Themen