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.
3 Réponses :
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]))
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
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')
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
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)
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.