2017-10-06 17 views
1

J'ai une image Python avec une colonne contenant des valeurs au format suivant: nombres/nombres-lettres-nombres. Exemple: 2/39-C-19. Je voudrais prendre les valeurs dans cette colonne et les diviser et les affecter à de nouvelles colonnes dans mon dataframe.Diviser le contenu d'une image Python en nouvelles colonnes

J'ai essayé quelques expressions régulières, bien que je n'ai pas trouvé un bon moyen d'exclure l'index de données. La regex '(?: \ D *.)? \ D +' me donne tous les nombres de la colonne incluant l'index.

Donc, ceci est un exemple de mes données brutes de mon dataframe:

LOCATION 
0 2/39-C-19 
1 130/3-A-09 
2 1/1-B-11 
3 22/5-B-16 
4 1/4-A-24 

Je suis en train de trouver une bonne façon d'analyser les valeurs, donc j'ai plusieurs colonnes comme ceci:

Number1 Number2 Letter Number3 
2 39 C 19 
130 3 A 9 
1 1 B 11 
22 5 B 16 
1 4 A 24 

Voici le code que je l'ai écrit jusqu'à présent:

import pandas as pd 
import re 
raw_data = 'file.csv' 
raw_data_df = pd.read_csv(raw_data) 
location_df = raw_data_df.iloc[:,[1]] 
location_string = str(location_df) 
re_location = re.findall('(?:\d*\.)?\d+', location_string) 
print(re_location) 

Toute réflexion sur la meilleure façon de s'y prendre ce? Je me demande si je n'ai pas besoin d'expressions régulières après tout et peut-être besoin de créer une boucle pour parcourir les valeurs dans la colonne?

Répondre

0
In [97]: cols = 'Number1 Number2 Letter Number3'.split() 

In [98]: df[cols] = df.LOCATION.str.extract(r'(\d+)/(\d+)-(\w+)-(\d+)', expand=True) 

In [99]: df 
Out[99]: 
    LOCATION Number1 Number2 Letter Number3 
0 2/39-C-19  2  39  C  19 
1 130/3-A-09  130  3  A  09 
2 1/1-B-11  1  1  B  11 
3 22/5-B-16  22  5  B  16 
4 1/4-A-24  1  4  A  24 

ou

In [107]: df.LOCATION.str.split(pat=r'[/-]', expand=True) 
Out[107]: 
    0 1 2 3 
0 2 39 C 19 
1 130 3 A 09 
2 1 1 B 11 
3 22 5 B 16 
4 1 4 A 24 
+0

Merci! C'était exactement ce que je cherchais. – mmmgood

+0

Je me demande: une approche similaire pourrait-elle être utilisée pour diviser une colonne df contenant le nom de famille, le prénom, les initiales (Ex1: Smith, John Ex2: Doe, Jane S)? L'essai a suivi l'approche suivante, qui a bien fonctionné pour les noms contenant le nom de famille, le prénom et l'initiale du milieu, bien que NaN soit apparu pour les noms avec seulement le nom et le prénom. Existe-t-il un bon moyen de rendre compte de l'initiale du second optionnel? cols2 = 'Last_name First_name Middle'.split() nom_fichier [cols2] = nom_fichier.NAME.str.extract (r' (\ w +), (\ w +) (\ w +) ', développez = Vrai) – mmmgood

+0

@mmmgood, oui, nous pouvons le faire, mais pensez à [noms contenant plusieurs mots] (https://www.google.de/amp/www.sheknows.com/parenting/articles/825167/top-double-baby-names-for -girls-and-boys/amp) – MaxU

0

Je laisserai à vous jusqu'à la mise en œuvre dans votre dataframe, mais cela ne devrait fournir un moyen simple de diviser vos chaînes de localisation en plusieurs éléments:

import re 

s = ['2/39-C-19', '130/3-A-09', '1/1-B-11', '22/5-B-16', '1/4-A-24'] 

for i in s: 
    s_new = re.split(r'[/-]',i) 
    print(s_new) 

SORTIE:

['2', '39', 'C', '19'] 
['130', '3', 'A', '09'] 
['1', '1', 'B', '11'] 
['22', '5', 'B', '16'] 
['1', '4', 'A', '24'] 
+0

Merci. Je suis assez nouveau pour re. Donc, il semble que la méthode split scinde les caractères/et - dans ce cas. Ce sera une bonne notation pour moi à retenir dans le futur. – mmmgood

+0

Vous pariez. Et oui, cette regex se scinde sur '/' et '-' en utilisant des classes de caractères. Je recommanderais les vidéos suivantes si vous voulez une exposition à des expressions régulières, cela m'a beaucoup aidé: https://www.youtube.com/watch?v=7DG3kCDx53c – rahlf23