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.