13
votes

pandas lisent csv ignorent le point-virgule de fin de la dernière colonne

Mon fichier de données ressemble à ceci:

df = pd.read_csv('data.txt')
df
    user    activity    timestamp   x-axis  y-axis  z-axis
0   33  Jogging     49105962326000  -0.694638   12.680544   0.50395286;
1   33  Jogging     49106062271000  5.012288    11.264028   0.95342433;
2   33  Jogging     49106112167000  4.903325    10.882658   -0.08172209;
3   33  Jogging     49106222305000  -0.612916   18.496431   3.0237172;

Comme on peut le voir, la dernière colonne se termine par un point-virgule, donc lorsque je lis dans pandas, la colonne est déduite comme objet de type (se terminant par le point-virgule.

data.txt
user,activity,timestamp,x-axis,y-axis,z-axis
0,33,Jogging,49105962326000,-0.6946376999999999,12.680544,0.50395286;
1,33,Jogging,49106062271000,5.012288,11.264028,0.95342433;
2,33,Jogging,49106112167000,4.903325,10.882658000000001,-0.08172209;
3,33,Jogging,49106222305000,-0.61291564,18.496431,3.0237172;

Comment faire pour que les pandas ignorent ce point-virgule?


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser les converters param:

  1. pour analyser votre chaîne
  2. remplacer ;
  3. convertir en flottant
df = pd.read_csv('data.txt', sep=",", converters={"z-axis": lambda x: float(x.replace(";",""))})
print(df)

   data  txtuser activity       timestamp    x-axis     y-axis    z-axis
0     0       33  Jogging  49105962326000 -0.694638  12.680544  0.503953
1     1       33  Jogging  49106062271000  5.012288  11.264028  0.953424
2     2       33  Jogging  49106112167000  4.903325  10.882658 -0.081722
3     3       33  Jogging  49106222305000 -0.612916  18.496431  3.023717


0 commentaires

13
votes

Le problème avec votre txt est qu'il a un contenu mixte. Comme je peux le voir, l'en-tête n'a pas le point-virgule comme caractère de terminaison

Si vous modifiez la première ligne en ajoutant le point-virgule, c'est assez simple

pd.read_csv("data.txt", lineterminator=";")


0 commentaires

8
votes

Ce n'est peut-être pas le cas, mais cela fonctionne étant donné l'exemple.

Dans la documentation, vous pouvez trouver un paramètre de comment qui:

indique que le reste de la ligne ne doit pas être analysé. Si elle se trouve au début d'une ligne, la ligne sera complètement ignorée. Ce paramètre doit être un seul caractère. Comme les lignes vides (tant que skip_blank_lines = True), les lignes entièrement commentées sont ignorées par l'en-tête du paramètre mais pas par skiprows. Par exemple, si comment = '#', l'analyse de #empty \ na, b, c \ n1,2,3 avec header = 0 entraînera le traitement de â € ˜˜a, b, câ € ™ comme en-tête.

Alors si ; n'a pu être trouvé qu'à la fin de votre dernière colonne:

>>> df = pd.read_csv("data.txt", comment=";")
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   user       4 non-null      int64  
 1   activity   4 non-null      object 
 2   timestamp  4 non-null      int64  
 3   x-axis     4 non-null      float64
 4   y-axis     4 non-null      float64
 5   z-axis     4 non-null      float64
dtypes: float64(3), int64(2), object(1)
memory usage: 224.0+ bytes
>>> df
   user activity       timestamp    x-axis     y-axis    z-axis
0    33  Jogging  49105962326000 -0.694638  12.680544  0.503953
1    33  Jogging  49106062271000  5.012288  11.264028  0.953424
2    33  Jogging  49106112167000  4.903325  10.882658 -0.081722
3    33  Jogging  49106222305000 -0.612916  18.496431  3.023717


0 commentaires