web-dev-qa-db-fra.com

Ajouter une ligne vide dans le cadre de données en utilisant pandas

J'essaie d'ajouter une ligne vide à la fin de la structure de données, mais je ne peux pas le faire, même en essayant de comprendre comment pandas) fonctionne avec la fonction append et ne l'obtient toujours pas.

Voici le code:

import pandas as pd

Excel_names = ["ARMANI+EMPORIO+AR0143-book.xlsx"]
excels = [pd.ExcelFile(name) for name in Excel_names]
frames = [x.parse(x.sheet_names[0], header=None,index_col=None).dropna(how='all') for x in excels]
for f in frames:
    f.append(0, float('NaN'))
    f.append(2, float('NaN'))

Il y a deux colonnes et un nombre aléatoire de lignes.

avec "print f" dans la boucle i Obtenez ceci:

                             0                 1
0                   Brand Name    Emporio Armani
2                 Model number            AR0143
4                  Part Number            AR0143
6                   Item Shape       Rectangular
8   Dial Window Material Type           Mineral
10               Display Type          Analogue
12                 Clasp Type            Buckle
14               Case Material   Stainless steel
16              Case Diameter    31 millimetres
18               Band Material           Leather
20                 Band Length  Women's Standard
22                 Band Colour             Black
24                 Dial Colour             Black
26            Special Features       second-hand
28                    Movement            Quartz
18
Mansoor Akram

Ajoutez un nouveau pandas.Series à l’aide de pandas.DataFrame.append ().

Si vous souhaitez spécifier le nom (AKA l'index) de la nouvelle ligne, utilisez:

df.append(pandas.Series(name='NameOfNewRow'))

Si vous ne souhaitez pas nommer la nouvelle ligne, utilisez:

df.append(pandas.Series(), ignore_index=True)

df est votre pandas.DataFrame.

12
srcerer

Vous pouvez l'ajouter en ajoutant une série à la trame de données comme suit. Je suppose en blanc que vous voulez ajouter une ligne contenant uniquement "Nan". Vous pouvez d'abord créer un objet Series avec Nan. Assurez-vous de spécifier les colonnes lors de la définition de l'objet 'Series' dans le paramètre -Index. Vous pouvez l'ajouter au FD. J'espère que ça aide!

from numpy import nan as Nan
import pandas as pd

>>> df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
...                     'B': ['B0', 'B1', 'B2', 'B3'],
...                     'C': ['C0', 'C1', 'C2', 'C3'],
...                     'D': ['D0', 'D1', 'D2', 'D3']},
...                     index=[0, 1, 2, 3])

>>> s2 = pd.Series([Nan,Nan,Nan,Nan], index=['A', 'B', 'C', 'D'])
>>> result = df1.append(s2)
>>> result
     A    B    C    D
0   A0   B0   C0   D0
1   A1   B1   C1   D1
2   A2   B2   C2   D2
3   A3   B3   C3   D3
4  NaN  NaN  NaN  NaN
13
silent_dev

En supposant que df soit votre cadre de données,

df_prime = pd.concat([df, pd.DataFrame([[np.nan] * df.shape[1]], columns=df.columns)], ignore_index=True)

df_prime est égal à df avec une dernière ligne supplémentaire de NaN.

Notez que pd.concat est lent, donc si vous avez besoin de cette fonctionnalité dans une boucle, évitez de l’utiliser. Dans ce cas, en supposant que votre index soit incrémental, vous pouvez utiliser

df.loc[df.iloc[-1].name + 1,:] = np.nan
3
Dave Reikher

Vous pouvez ajouter une nouvelle série et la nommer en même temps. Le nom sera l'index de la nouvelle ligne et toutes les valeurs seront automatiquement NaN.

df.append(pd.Series(name='Afterthought'))
3
pocketdora

Le code ci-dessous a fonctionné pour moi.

df.append(pd.Series([np.nan]), ignore_index = True)
2
kamal tanwar

En supposant que votre fichier df.index soit trié, vous pouvez utiliser:

df.loc[df.index.max() + 1] = None

Il gère bien les différents index et types de colonnes.

[EDIT] cela fonctionne avec pd.DatetimeIndex s'il y a une fréquence constante, sinon nous devons spécifier exactement le nouvel index, par exemple:

df.loc[df.index.max() + pd.Timedelta(milliseconds=1)] = None

long exemple:

df = pd.DataFrame([[pd.Timestamp(12432423), 23, 'text_field']], 
                    columns=["timestamp", "speed", "text"],
                    index=pd.DatetimeIndex(start='2111-11-11',freq='ms', periods=1))
df.info()

<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 1 entries, 2111-11-11 to 2111-11-11 Freq: L Data columns (total 3 columns): timestamp 1 non-null datetime64[ns] speed 1 non-null int64 text 1 non-null object dtypes: datetime64[ns](1), int64(1), object(1) memory usage: 32.0+ bytes

df.loc[df.index.max() + 1] = None
df.info()

<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 2 entries, 2111-11-11 00:00:00 to 2111-11-11 00:00:00.001000 Data columns (total 3 columns): timestamp 1 non-null datetime64[ns] speed 1 non-null float64 text 1 non-null object dtypes: datetime64[ns](1), float64(1), object(1) memory usage: 64.0+ bytes

df.head()

                            timestamp                   speed      text
2111-11-11 00:00:00.000 1970-01-01 00:00:00.012432423   23.0    text_field
2111-11-11 00:00:00.001 NaT NaN NaN
1
Daniel R