2017-10-19 18 views
-2

J'ai un fichier.txt (séparé par des tabulations) qui doit être changé en une image, ordonnant fondamentalement la lecture du fichier ligne par ligne et créant des colonnes uniques pour l'image finale. De plus, écrire "Na" ou valeur vide quand aucune information n'est fondée. Notez le "CS_" comme un motif après ":". Je pensais au fichier pandas, mais votre aide sera grandement appréciée. Une suggestion dans R pourrait également être appréciée.Création de données uniques lisant un fichier ligne par ligne

entrée:

Japan  Cases:CS_1 People:CS_2 Life:CS_3 
Australia People:CS_4 Transportation:CS_Ground 
Spain  Life:CS_5  Language:CS_Spanish 

sortie:

   Cases  People Life  Transportation  Language 
Japan  CS_1  CS_2  CS_3  Na     Na 
Australia Na  CS_4  Na  CS_Ground   Na 
Spain  Na  Na  CS_5  Na     CS_Spanish 
+0

Qu'avez-vous essayé jusqu'à présent? – asongtoruin

+1

Une façon serait de lire le fichier texte dans un dict imbriqué avec le pays comme clé externe: '{'Japan': {'Cases': 'CS_1', 'People': CS_2 ',' Life ':' CS_3 '},' Australia ': {...},' Spain ': {...}} ', puis passez en revue le dict pour obtenir tous les noms de colonnes. Ensuite, créez votre dataframe. – DaveL17

+0

Bien sûr, j'utilise python parce que j'ai un énorme fichier de données, sinon votre solution sera loin. J'ai des milliers de lignes et plus de 10 colonnes différentes – gusa10

Répondre

0

Donné:

>>> from io import StringIO 
>>> infile = """Japan Cases:CS_1 People:CS_2 Life:CS_3 
... Australia People:CS_4 Transportation:CS_Ground 
... Spain Life:CS_5 Language:CS_Spanish""" 

Itérer à travers le fichier ligne par ligne:

  1. Partitionnez la première colonne du reste
  2. Divisez le reste avec le délimiteur approprié (par ex. \s ou \t)
  3. Fendez chaque élément en paires clé-valeur dont les clés sont les en-têtes de colonne que vous voulez dans la dataframe finale
  4. Ajouter les premières valeurs de colonne (par exemple les noms de pays) et utiliser un nom d'en-tête temporaire (par exemple Key)
  5. magasin le dictionnaire dans une liste

[code]:

>>> row_dicts = [] 
>>> for line in StringIO(infile): 
...  k, _, therest =line.partition(' ') # Step 1. 
...  _row = {kv.split(':')[0]:kv.split(':')[1] for kv in therest.split()} # Step 2-3. 
...  _row['Key'] = k # Step 4. 
...  row_dicts.append(_row) # Step 5. 
... 

Cast la liste des des dictionnaires dans un pd.DataFrame:

>>> pd.DataFrame(row_dicts) 
    Cases  Key Language Life People Transportation 
0 CS_1  Japan   NaN CS_3 CS_2   NaN 
1 NaN Australia   NaN NaN CS_4  CS_Ground 
2 NaN  Spain CS_Spanish CS_5 NaN   NaN 

Utilisation .set_index pour définir le pays Key colonne comme index.

>>> df.set_index('Key') 
      Cases Language Life People Transportation 
Key              
Japan  CS_1   NaN CS_3 CS_2   NaN 
Australia NaN   NaN NaN CS_4  CS_Ground 
Spain  NaN CS_Spanish CS_5 NaN   NaN 
0

Vous pouvez utiliser (en utilisant un générateur et une compréhension):

import re, pandas as pd 

string = """ 
Japan  Cases:CS_1 People:CS_2 Life:CS_3 
Australia People:CS_4 Transportation:CS_Ground 
Spain  Life:CS_5  Language:CS_Spanish 
""" 

rx = re.compile(r'(?P<key>\w+):(?P<value>CS_\d+)') 
rxc = re.compile(r'(?P<country>\w+)') 

dft = (dict({'Country': item.group('country')}, **{m.group('key'): m.group('value') for m in rx.finditer(line)}) 
     for line in string.split("\n") 
     for item in [rxc.match(line)] 
     if item) 

df = pd.DataFrame(dft) 
print(df) 

Il utilise deux expressions régulières, un pour le pays et l'autre pour les paires clé/valeur. Ensuite, le df est construit.