web-dev-qa-db-fra.com

ajouter une ligne en haut dans le cadre de données pandas

Ci-dessous mon cadre de données

import pandas as pd
df = pd.DataFrame({'name': ['jon','sam','jane','bob'],
           'age': [30,25,18,26],
           'sex':['male','male','female','male']})


   age  name     sex
0   30   jon    male
1   25   sam    male
2   18  jane  female
3   26   bob    male

Je veux insérer une nouvelle ligne à la première position

nom: dean, âge: 45 ans, sexe: homme

   age  name     sex
0   45  dean    male
1   30   jon    male
2   25   sam    male
3   18  jane  female
4   26   bob    male

Quelle est la meilleure façon de faire cela dans les pandas?

13
Shubham

S'il s'agit d'une opération fréquente, il est logique (en termes de performances) de rassembler d'abord les données dans une liste, puis d'utiliser pd.concat([], ignore_index=True) (similaire à @ solution de Serenity ):

Démo:

data = []

# always inserting new rows at the first position - last row will be always on top    
data.insert(0, {'name': 'dean', 'age': 45, 'sex': 'male'})
data.insert(0, {'name': 'joe', 'age': 33, 'sex': 'male'})
#...

pd.concat([pd.DataFrame(data), df], ignore_index=True)

In [56]: pd.concat([pd.DataFrame(data), df], ignore_index=True)
Out[56]:
   age  name     sex
0   33   joe    male
1   45  dean    male
2   30   jon    male
3   25   sam    male
4   18  jane  female
5   26   bob    male

PS Je n’appellerais pas .append(), pd.concat(), .sort_index() trop souvent (pour chaque rangée) car c’est assez cher. Donc, l'idée est de le faire en morceaux ...

9
MaxU

Ce n’est probablement pas le moyen le plus efficace, mais:

df.loc[-1] = ['45', 'Dean', 'male']  # adding a row
df.index = df.index + 1  # shifting index
df.sort_index(inplace=True) 

Sortie:

 age  name     sex
0  45  Dean    male
1  30   jon    male
2  25   sam    male
3  18  jane  female
4  26   bob    male
11
edyvedy13

La solution de @ edyvedy13 a très bien fonctionné pour moi. Cependant, il doit être mis à jour pour la méthode deprecation of de sort de pandas - désormais remplacé par sort_index.

 df.loc[-1] = ['45', 'Dean', 'male']  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index
3
Edward Atkins

Utilisez pandas.concat et réindexez le nouveau cadre de données:

import pandas as pd
df = pd.DataFrame({'name': ['jon','sam','jane','bob'],
           'age': [30,25,18,26],
           'sex':['male','male','female','male']})
# new line
line = pd.DataFrame({'name': 'dean', 'age': 45, 'sex': 'male'}, index=[0])
# concatenate two dataframe
df2 = pd.concat([line,df.ix[:]]).reset_index(drop=True)
print (df2)

Sortie:

   age  name     sex
0   45  dean    male
1   30   jon    male
2   25   sam    male
3   18  jane  female
4   26   bob    male
1
Serenity
import pandas as pd


df = pd.DataFrame({'name': ['jon','sam','jane','bob'],
           'age': [30,25,18,26],
           'sex': ['male','male','female','male']})

df1 = pd.DataFrame({'name': ['dean'], 'age': [45], 'sex':['male']})
df1 = df1.append(df)
df1 = df1.reset_index(drop=True)

Ça marche

1
dylan_fan

Cela fonctionnera pour moi.

>>> import pandas as pd
>>> df = pd.DataFrame({'name': ['jon','sam','jane','bob'],
...            'age': [30,25,18,26],
...            'sex':['male','male','female','male']})     >>> df
   age  name     sex
0   30   jon    male
1   25   sam    male
2   18  jane  female
3   26   bob    male
>>> df.loc['a']=[45,'dean','male']
>>> df
   age  name     sex
0   30   jon    male
1   25   sam    male
2   18  jane  female
3   26   bob    male
a   45  dean    male
>>> newIndex=['a']+[ind for ind in df.index if ind!='a']
>>> df=df.reindex(index=newIndex)
>>> df
   age  name     sex
a   45  dean    male
0   30   jon    male
1   25   sam    male
2   18  jane  female
3   26   bob    male
0
husimu