3
votes

Comment diviser la colonne dans les pandas pour obtenir null dans la première colonne si

J'essaie de diviser ma colonne de données d'entrée en 2 colonnes à l'aide de la division en pandas en utilisant "" comme séparateur. Quand je l'utilise, j'obtiens toutes les entrées avant "" dans la colonne 1 et les autres dans la colonne 2.

Données d'entrée: -

 CR ID         
2969721            0       AIR5    
2969165            3       CCN1_3_6    
2968440            3       CCN1,2,3    
2968199           12       SDP5,6,7,8,9,10    
2967663            3       CCN2a_CCN2b_CCN3    
2965269            0       EMM  

Code i my using: -

CR ID         
2969721            AIR5          0  
2969165               3         CCN1_3_6   
2968440               3         CCN1,2,3   
2968199              12         SDP5,6,7,8,9,10    
2967663               3         CCN2a_CCN2b_CCN3   
2965269             EMM          0

Sortie que j'obtiens: -

df['Node Touch'] = df['Site ID'].str.split('_').str.get(0).fillna(0)   
df['Site ID'] = df['Site ID'].str.split('_').str.get(1).fillna(0)

Mais, je veux que si "_" n'est pas là dans les données d'entrée, la première colonne devrait avoir 0 et la deuxième comme valeur de colonne

Sortie attendue: -

Site ID

AIR5   
3_CCN1_3_6   
3_CCN1,2,3   
12_SDP5,6,7,8,9,10  
3_CCN2a_CCN2b_CCN3  
EMM


0 commentaires

5 Réponses :


1
votes

La solution à votre problème est de vérifier si '_' est présent dans la chaîne et de modifier votre sortie en conséquence. Vous pouvez y parvenir en utilisant np.where.

Node_touch = df['Site ID'].str.split('_').str.get(0)  
Site_ID = df['Site ID'].str.split('_').str.get(1)
check_underscore = df['Site ID'].str.contains('_')
df['Node Touch'] = np.where(check_underscore, Node_touch, 0)   
df['Site ID'] = np.where(check_underscore, Site_ID, df['Site ID'])


0 commentaires

3
votes

Modifiez les chaînes qui ne contiennent pas de trait de soulignement, puis divisez

df[['Node Touch', 'Site ID']] = df['Site ID'].str.split('_', 1, expand = True)
df['Site ID'] = df['Site ID'].combine_first(df['Node Touch'])
df['Node Touch'] = pd.to_numeric(df['Node Touch'], errors = 'coerce').fillna(0).astype(int)

Option 2: Si vos colonnes Node seront toujours numériques, vous pouvez essayer ceci. Bien que je pense que la première solution est plus simple

df.loc[~df['Site ID'].str.contains('_'), 'Site ID'] = '0_' + df['Site ID']
df[['Node Touch', 'Site ID']] = df['Site ID'].str.split('_', 1, expand = True)

    Site ID             Node Touch
0   AIR5                0
1   CCN1_3_6            3
2   CCN1,2,3            3
3   SDP5,6,7,8,9,10     12
4   CCN2a_CCN2b_CCN3    3
5   EMM                 0


0 commentaires

3
votes

Vous pouvez utiliser extract avec des groupes de capture optionnels regex:

            Site ID Node Touch
0              AIR5          0
1          CCN1_3_6          3
2              CCN1          3
3              SDP5         12
4  CCN2a_CCN2b_CCN3          3
5               EMM          0

Sortie:

df[['Node Touch', 'Site ID']] = df['Site ID'].str.extract('(\d+)?_?(\w+)_?').fillna(0)


1 commentaires

Je ne peux pas croire que je n'ai pas pensé à l'extrait :)



1
votes

Une autre méthode utilisant df .shift () après la séparation.

df[['Node Touch', 'Site ID']]=df['Site ID'].str.split("_",n=1,expand=True)
df.loc[df['Site ID'].isna(),['Node Touch', 'Site ID']] = df[['Node Touch', 'Site ID']].shift(axis=1).fillna(0)
print(df)

            Site ID Node Touch
0              AIR5          0
1          CCN1_3_6          3
2          CCN1,2,3          3
3   SDP5,6,7,8,9,10         12
4  CCN2a_CCN2b_CCN3          3
5               EMM          0


0 commentaires

0
votes

merci à tous ... j'ai utilisé la logique de l'ajout de 1_ dans le préfixe des entrées non soulignées et cela a fonctionné.

IN: -

df.loc [~ df [' ID de site ']. Str.contains (' _ '),' ID de site '] =' 1_ '+ df [' ID de site ']
df [['Node Touch', 'Site ID']] = df ['Site ID']. str.split ('_', 1, expand = True) print (df [['Node Touch', 'Site ID']])

OUT: -

        Node Touch                                           Site ID   
CR ID                                                               
2969721          1                                              AIR5   
2969165          3                                          CCN1_3_6    
2968440          3                                          CCN1,2,3   
2968199         12                                   SDP5,6,7,8,9,10    
2967663          3                                  CCN2a_CCN2b_CCN3    
2965269          1                                               EMM    


1 commentaires

Ce serait bien si vous acceptez la solution qui a fonctionné pour vous plutôt que de publier la même chose comme réponse