Domanda Inserisci una riga su dataframe panda


Ho un dataframe ..

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]

e ho bisogno di aggiungere una prima riga [2, 3, 4] per ottenere ..

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

Ho provato le funzioni append () e concat () ma in qualche modo non riesco a trovare il modo giusto come farlo.

Qualche idea? C'è un modo diretto come aggiungere / inserire serie in dataframe?


44
2018-06-18 11:27


origine


risposte:


Assegna semplicemente una riga a un particolare indice, usando loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index

E ottieni, se lo desideri:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9

Vedi nella documentazione di Pandas Indicizzazione: impostazione con ingrandimento.


65
2018-06-18 11:44



Un modo per ottenere questo è

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

In genere, è più semplice aggiungere i frame di dati, non le serie. Nel tuo caso, dal momento che vuoi che la nuova riga sia "in cima" (con id iniziale) e non ci sia alcuna funzione pd.prepend(), Prima creo il nuovo dataframe e poi aggiungo quello vecchio.

ignore_index ignorerà il vecchio indice in corso nel tuo dataframe e assicurerà che la prima riga inizi effettivamente con l'indice 1 invece di riavviare con l'indice 0.

Tipico Disclaimer: Cetero Censeo ... accodare le file è un'operazione abbastanza inefficiente. Se ti interessano le prestazioni e puoi in qualche modo assicurarti di creare prima un dataframe con l'indice corretto (più lungo) e poi semplicemente inserzione la riga aggiuntiva nel dataframe, dovresti assolutamente farlo. Vedere:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]

Finora, abbiamo quello che hai avuto df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9

Ma ora puoi facilmente inserire la riga come segue. Poiché lo spazio è stato preallocato, questo è più efficiente.

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

17
2018-06-18 11:36



Non sei sicuro di come stavi chiamando concat () ma dovrebbe funzionare fintanto che entrambi gli oggetti sono dello stesso tipo. Forse il problema è che devi lanciare il tuo secondo vettore in un dataframe? Usando il df che hai definito il seguente funziona per me.

>>>df2 = pd.DataFrame([[2,3,4]],columns=['A','B','C'])
>>>pd.concat([df2,df])

10
2018-06-18 13:42



Ho messo insieme una breve funzione che consente un po 'più di flessibilità quando si inserisce una riga:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df

che potrebbe essere ulteriormente ridotto a:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

Quindi potresti usare qualcosa come:

df = insert_row(2, df, df_new)

dove 2 è la posizione dell'indice in df dove vuoi inserire df_new.


4
2017-09-21 22:34



Possiamo usare numpy.insert. Questo ha il vantaggio della flessibilità. Hai solo bisogno di specificare l'indice che vuoi inserire.

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9

Per np.insert(df.values, 0, values=[2, 3, 4], axis=0), 0 indica alla funzione il luogo / indice in cui si desidera posizionare i nuovi valori.


0
2018-01-15 23:09