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
5 Réponses :
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'])
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
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)
Je ne peux pas croire que je n'ai pas pensé à l'extrait :)
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
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
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