3 votes

Comment créer un DataFrame à partir de valeurs personnalisées ?

Je lis un fichier texte, sur chaque ligne il y a plusieurs valeurs. Je les analyse en fonction des besoins à l'aide de la fonction parse.

def parse(line):
    ......
    ......
    return line[0],line[2],line[5]

Je veux créer un cadre de données, avec chaque ligne en tant que ligne et les trois valeurs rétablies en tant que colonnes.

df = pd.DataFrame()

with open('data.txt') as f:
    for line in f:
       df.append(line(parse(line)))

Lorsque j'exécute le code ci-dessus, j'obtiens toutes les valeurs dans une seule colonne. Est-il possible de les obtenir dans un format tabulaire approprié ?

4voto

juanpa.arrivillaga Points 35811

Tu ne devrais pas .append a DataFrame dans une boucle, ce qui est de toute façon très inefficace. Faites quelque chose comme :

colnames = ['col1','col2','col3'] # or whatever you want
with open('data.txt') as f:
    df = pd.DataFrame([parse(l) for l in f], columns=colnames)

Remarque, le problème fondamental est que pd.DataFrame.append s'attend à ce que un autre cadre de données et il ajoute le rangées de cet autre cadre de données. Il interprète une liste comme un ensemble de lignes individuelles. Notez donc que si vous structurez votre liste de manière à avoir des "lignes", cela fonctionnera comme prévu. Mais vous ne devriez pas utiliser .append ici de toute façon :

In [6]: df.append([1,2,3])
Out[6]:
   0
0  1
1  2
2  3

In [7]: df = pd.DataFrame()

In [8]: df.append([[1, 2, 3]])
Out[8]:
   0  1  2
0  1  2  3

0voto

Une façon rapide de le faire (TL;DR) :

Création de la nouvelle colonne :

  `df['com_zeros'] = '0'`

Application de la condition : :

for b in df.itertuples():
    df.com_zeros[b.Index] = '0'+str(b.battles) if b.battles<9 else str(b.battles)

Résultat :

df
     regiment company deaths  battles size com_zeros
0  Nighthawks     1st    kkk        5    l        05
1  Nighthawks     1st     52       42   ll        42
2  Nighthawks     2nd     25        2    l        02
3  Nighthawks     2nd    616        2    m        02

Voir l'exemple de https://repl.it/JHW6 .

Obs.. : L'exemple fonctionnant sur repl.it semble se bloquer, mais ce n'est pas le cas, le chargement de pandas sur repl.it prend toujours du temps.

Pour supprimer les avertissements sur le notebook jupyter :

import warnings
warnings.filterwarnings('ignore')

0voto

kaihami Points 319

En plus de @juanpa.arrilaga,

Il semble que vous disposiez d'un fichier structuré et que vous ayez simplement besoin du premier, troisième et cinquième élément du fichier.

le charger et l'utiliser

df = pd.read_csv('file')

df.drop([colonnes],axis = 1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X