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