1
votes

Existe-t-il un moyen dans les pandas de python de faire du "texte aux colonnes" par emplacement (pas par un délimiteur) comme dans Excel?

J'utilise les données de l'historique des votes du secrétaire d'État, mais le fichier .txt qu'ils m'ont donné contient 7 millions de lignes, chaque ligne étant une chaîne de 27 caractères. Les 3 premiers caractères sont un code pour le comté. Les 8 caractères suivants sont l'ID d'enregistrement, les 8 caractères suivants sont la date du vote, etc. Je ne peux pas faire de texte aux colonnes dans Excel car le fichier est trop gros. Existe-t-il un moyen de séparer ce fichier en colonnes dans les pandas python?

Exemple

J'ai actuellement:

001 00004137 07312012 026 R

001 00004137 08212012 027 R

001 00004137 11062012 029

001 00045353 07312012 026 D

Je veux avoir des colonnes:

0010000413707312012026R

0010000413708212012027R

0010000413711062012029

0010004535307312012026D

Où chaque espace sépare une nouvelle colonne. Aucune suggestion? Merci.


2 commentaires

Avez-vous essayé d'utiliser pandas.pydata. org / pandas-docs / stable / reference / api /… ? Vous pouvez prendre une chaîne et la transformer en deux colonnes ou plus.


Oui, j'ai initialement pensé à utiliser la fonction de fractionnement, mais je pense qu'il doit y avoir une sorte de délimiteur séparant les colonnes pour l'utiliser, alors que mon ensemble de données n'a pas de délimiteur. Je suis relativement nouveau en python, alors corrigez-moi si je me trompe.


3 Réponses :


0
votes

Le fichier étant trop volumineux, il est préférable de le lire et de l’enregistrer dans un autre fichier, au lieu de lire le fichier entier en mémoire:

df = pd.read_csv('temp.csv', header=None)
df

#       0
# 0 0010000413707312012026R
# 1 0010000413708212012027R
# 2 0010000413711062012029
# 3 0010004535307312012026D

df = df[df.columns[0]].str.extract('(.{3})(.{8})(.{8})(.{3})(.*)')
df
#   0   1           2           3   4
# 0 001 00004137    07312012    026 R
# 1 001 00004137    08212012    027 R
# 2 001 00004137    11062012    029 
# 3 001 00045353    07312012    026 D

Vous pouvez également lire le contenu depuis le fichier txt et utilisez extract pour diviser les colonnes du dataframe

with open('temp.csv') as f:
    for line in f:
        code = line[0:3]
        registration = line[3:11]
        date = line[11:19]
        second_code = line[19:22]
        letter = line[22:]
        with open('modified.csv', 'a') as f2:
            f2.write(
                ' '.join([code, registration, date, second_code, letter]))


1 commentaires

Je pense qu'OP demande plus à emballer le résultat dans la trame de données pandas , plutôt que de l'écrire dans un nouveau fichier



0
votes

essayez ceci: Je pense que vous n'avez pas de problème pour lire le fichier txt , le cas simplifié serait comme ici:

a=['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D']
area=[]
date=[]
e1=[]
e2=[]
e3=[]
#001 00004137 07312012 026 R
for i in range (0,len(a)):
    area.append(a[i][0:3])
    date.append(a[i][3:11])
    e1.append(a[i][11:19])
    e2.append(a[i][19:22])
    e3.append(a[i][22:23])


all_list = pd.DataFrame(
    {'area': area,
     'date': date,
     'e1': e1,
     'e2': e2,
     'e3': e3   
    })
print(all_list )
#save as CSV file
all_list.to_csv('all.csv')


2 commentaires

Merci! Cela a du sens, je vais essayer ça.


merci d'avoir accepté la réponse, veuillez nous tenir au courant, la lecture de 7 millions de lignes serait un défi



1
votes

Le plus simple que je puisse faire:

     A         B         C    D  E
0  001  00004137  07312012  026  R
1  001  00004137  08212012  027  R
2  001  00004137  11062012  029   
3  001  00045353  07312012  026  D

Résultats:

import pandas as pd

sample_lines = ['0010000413707312012026R','0010000413708212012027R','0010000413711062012029','0010004535307312012026D]']

COLUMN_NAMES = ['A','B','C','D','E']
df = pd.DataFrame(columns=COLUMN_NAMES)
for line in sample_lines:
    row = [line[0:3], line[3:11], line[11:19], line[19:22], line[22:23]]
    df.loc[len(df)] = row

print (df)


0 commentaires