2017-10-09 3 views
-2

J'ai un exemple pour analyser un fichier de format similaire:
Exemple de données (.data):Essayer d'analyser un fichier .dat et stocke à la matrice 2-D dans Pandas

+ Naoki Abe 
- Myriam Abramson 
+ David W. Aha 
+ Kamal M. Ali 
- Eric Allender 

Et voici le exemple de python pour stocker le code dans un tableau 2D:

df = pd.read_csv(
    filepath_or_buffer='path/to/.data/file', 
    header=None, 
    sep=',') 

# separate names from classes 
vals = df.loc[:,:].values 
names = [n[0][2:] for n in vals] 
cls = [n[0][0] for n in vals] 

de ma compréhension, ce code python signifie que les données seront variables df et extrait les données de chaîne associées à chaque personne dans la variable vals. Et puis, il divise les chaînes de vals en names et cls. Et les listes names et cls doivent contenir ces composants de telle sorte que le nom de la personne iti soit dans names[i] et leur classe associée dans cls[i].

Cependant, quand je veux utiliser la manière similaire pour analyser un autre jeu de données similaires (.dat),

-1 this is comment1 blah blah blah (it is a big paragraph) 
-1 this is comment2 blah blah blah (it is a big paragraph) 
-1 this is comment3 blah blah blah (it is a big paragraph) 

Par conséquent, je modifié par exemple être comme:

# read in the dataset 
df = pd.read_csv(
    engine='python', 
    filepath_or_buffer='data/Pro1/train.dat', 
    header=None, 
    sep='\t+') 

# separate names from classes 
vals = df.loc[:,:].values 
comm = [n[0][2:] for n in vals] 
rates = [n[:1][0] for n in vals] 

Je suis erreur message: TypeError: 'long' object has no attribute '__getitem__' at comm = [n[0][2:] for n in vals]
J'ai cherché le message d'erreur, il a expliqué que cela signifiait que j'essayais de stocker un int dans la chaîne (?). J'essaie de stocker tout le paragraphe de commentaire et c'est une chaîne. Et dans l'exemple, il stockait une chaîne de noms très bien. Une autre question que j'ai depuis que je devais analyser un fichier .dat, je suppose que c'est TAB derrière -1 au lieu de l'espace, je ne suis pas sûr si la plage du tableau I est correct ** mis

Mon expérience.: Je ne suis pas un expert en python comme vous l'avez probablement deviné, je peux certainement lire le code mais je dois faire des recherches en cours de route. Python est mon seul choix en ce moment pour faire une telle analyse de données.

Répondre

0

Il n'y a pas de séparateurs de virgules dans le premier fichier et, par conséquent, chaque ligne du fichier résulte en une seule chaîne, par exemple, '+ Naoki Abe'. Par conséquent, vous pouvez utiliser le découpage de chaîne pour séparer les noms du reste des chaînes. J'ai également suspecté qu'il y ait un caractère de tabulation séparant le -1 du reste de chaque ligne. Le résultat est que les pandas divisent chaque ligne à l'onglet. Dans ce cas, vous ne pouvez pas utiliser le découpage de chaîne une fois que vous avez déclaré l'onglet comme séparateur.

>>> df2 = pd.read_csv('temp2.csv', engine='python', header=None, sep='\t') 
>>> vals2 = df2.loc[:,:].values 
>>> vals2 
array([[-1, 'this is comment1 blah blah blah (it is a big paragraph)'], 
     [-1, 'this is comment2 blah blah blah (it is a big paragraph)'], 
     [-1, 'this is comment3 blah blah blah (it is a big paragraph)']], dtype=object) 
>>> first = [val[0] for val in vals2] 
>>> first 
[-1, -1, -1] 
>>> second = [val[1] for val in vals2] 
>>> second 
['this is comment1 blah blah blah (it is a big paragraph)', 'this is comment2 blah blah blah (it is a big paragraph)', 'this is comment3 blah blah blah (it is a big paragraph)'] 

Mais ne désespérez pas!

Il existe un moyen de traiter les deux fichiers de données de la même manière.

Utilisez sep='\s+' pour que les onglets et les espaces soient traités de manière similaire. Ensuite, les pandas transformeront chaque ligne en une liste de chaînes. Tout ce que vous devez faire maintenant est de retirer le premier objet et de réassembler les autres.

>>> df3 = pd.read_csv('temp2.csv', engine='python', header=None, sep='\s+') 
>>> vals3 = df3.loc[:,:].values 
>>> vals3 
array([[-1, 'this', 'is', 'comment1', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)'], 
     [-1, 'this', 'is', 'comment2', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)'], 
     [-1, 'this', 'is', 'comment3', 'blah', 'blah', 'blah', '(it', 'is', 
     'a', 'big', 'paragraph)']], dtype=object) 
>>> first = [val[0] for val in vals3] 
>>> first 
[-1, -1, -1] 
>>> second = [' '.join(val[1:]) for val in vals3] 
>>> second 
['this is comment1 blah blah blah (it is a big paragraph)', 'this is comment2 blah blah blah (it is a big paragraph)', 'this is comment3 blah blah blah (it is a big paragraph)'] 

Ma dernière remarque: je remets en question votre utilisation des pandas sur le module csv.