2017-05-20 8 views
1

Ich habe ein paar Antworten auf "Einfügen einer Zeile in einem Pandas-Datenframe" gesehen, aber sie gehen normalerweise von einer einzelnen Zeileneinfügung aus oder sind ansonsten etwas anders als das, wonach ich suche.Pandas: Einfügen von Zeilen ohne Schleife

Ich bin auf der Suche nach einer Zeile aus einem anderen Datenrahmen mehrmals in df einfügen, basierend auf einer Bedingung.

Der folgende Code "funktioniert" in dem es gibt mir, was ich suche, aber ich frage mich, ob dies ohne eine for Schleife durchgeführt werden kann.

df = pd.DataFrame({ 
     'a':[1,2,3,2,3,1,1,2,1,2,3,3,1,3], 
     'b':[0,0,0,0,0,0,0,0,0,0,0,0,0,0] 
    }) 

df2 = pd.DataFrame(columns = df.columns) 

row_fill = pd.DataFrame({'a':[100],'b':[200]}) 

for i in df.index: 
    if df['a'][i] == 2: 
     df2 = df2.append(row_fill) 

    df2 = df2.append(df.loc[i]) 

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

Jede Hilfe wird geschätzt.

Antwort

1

Ich würde es auf diese Weise tun:

Quelle DF:

In [153]: df 
Out[153]: 
    a b 
0 1 0 
1 2 0 
2 3 0 
3 2 0 
4 3 0 
5 1 0 
6 1 0 
7 2 0 
8 1 0 
9 2 0 
10 3 0 
11 3 0 
12 1 0 
13 3 0 

Lösung:

In [154]: idx = np.argwhere(df.a == 2) # Pandas alternative: idx = df.index[df.a == 2] 

In [155]: new = pd.concat([row_fill] * len(idx)).set_index(idx-1) 

In [156]: new 
Out[156]: 
    a b 
0 100 200 
2 100 200 
6 100 200 
8 100 200 

Das gleiche kann mit Dataframe Konstruktor erreicht werden:

new = pd.DataFrame(row_fill.values.tolist() * len(idx), 
        columns=row_fill.columns, index=idx-1) 

jetzt können wir verketten df und new, Sortierindex in der resultierenden DF und setzen Sie den Index:

In [157]: res = pd.concat([df, new]).sort_index().reset_index(drop=True) 

In [158]: res 
Out[158]: 
     a b 
0  1 0 
1 100 200 
2  2 0 
3  3 0 
4 100 200 
5  2 0 
6  3 0 
7  1 0 
8  1 0 
9 100 200 
10 2 0 
11 1 0 
12 100 200 
13 2 0 
14 3 0 
15 3 0 
16 1 0 
17 3 0 
+0

Dank @MaxU - ich bin gerade durch dieses Recht zu denken. Ich bin mit Numpy nicht vertraut. Aber offensichtlich funktioniert es! – pshep123

+0

@ pshep123, Sie sind willkommen :) Wenn Sie nicht möchten, Numpy, können wir verwenden: 'idx = df.index [df.a == 2]' statt – MaxU

+0

Das ist großartig, noch einmal @MaxU. Ich habe die letzte '.concat()' Funktion abgebrochen, nur um zu sehen, was vor sich geht. Liegt es daran, dass das 'df' in dem' .concat() 'zuerst ist, dass es vor' new' geht, obwohl sie denselben Index haben? – pshep123

Verwandte Themen