En Python, j'essaye d'extraire une valeur unique d'un dataframe Pandas. Je sais exactement ce que contient la valeur, j'ai juste besoin de la trouver n'importe où dans le dataframe et de l'extraire.
Par exemple, dans le dataframe ci-dessous:
da_value = 'DA1234'
Je veux pour extraire la chaîne contenant les deux lettres 'DA' et exactement 4 chiffres après.
J'ai essayé ceci en utilisant un masque:
da_value = df[mask]
da_value
0 1 2
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 DA1234 NaN NaN
4 NaN NaN NaN
5 NaN NaN NaN
Ce qui semble fonctionner:
mask = pd.DataFrame(np.column_stack([df[col].str.contains('^DA\d{4}', na = False) for col in df]))
Cependant, comment extraire la valeur du dataframe? Existe-t-il un moyen meilleur / plus simple de faire cela?
Modifier: Le résultat que je veux réellement est
df = pd.DataFrame(
{0: ['BA1234', 'CA:1234', 'DA','DA1234', 'EX DA', 'CA1234'],
1: ['BA1234', 'CA:1234', 'DA','CA1234', 'EX DA', 'CA1234'],
2: ['BA1234', 'CA:1234', 'DA','CA1234', 'EX DA', 'CA1234']})
4 Réponses :
Utilisez DataFrame.stack d'abord pour la Series , puis filtrer par indexation booléenne avec Series.str.contains :
print (next(iter(a), 'no match')) DA1234
Si besoin de la première valeur de la liste vous pouvez sélectionner:
print (a[0]) DA1234
Ou solution générale si possible aucune valeur n'existe, alors la valeur par défaut est ajoutée:
s = df.stack()
a = s[s.str.contains(r'^DA\d{4}', na=False)].tolist()
Désolé, j'ai réalisé que ma question n'était pas claire. Le résultat que je recherche en fait est la chaîne elle-même 'DA1234'
Génial, c'est ce que je recherche. Je vous remercie!
si vous voulez seulement cette ligne dans laquelle une chaîne suit la condition, ci-dessous fonctionne
en utilisant re.findall
'DA1234'
df.apply(lambda x: re.findall('^DA\d{4}',' '.join(list(x))), axis=1).any()[0]
Mis à jour
0 1 2 3 DA1234 CA1234 CA1234
df.loc[df.apply(lambda x: True if re.findall('^DA\d{4}',x[0]) or re.findall('^DA\d{4}',x[1]) or re.findall('^DA\d{4}',x[2]) else False, axis=1)]
Désolé, j'ai réalisé que ma question n'était pas claire. Le résultat que je recherche en fait est la chaîne elle-même 'DA1234'
Vous pouvez utiliser df.apply () pour appliquer series.str.contains () avec df.any () over axis = 1 pour récupérer les lignes où une colonne correspond au modèle: 0 1 2
3 DA1234 CA1234 CA1234
df[df.apply(lambda x: x.str.contains(r'^DA\d{4}', na=False)).any(axis=1)]
j'aime ça .. + 1
Désolé, j'ai réalisé que ma question n'était pas claire. Le résultat que je recherche en fait est la chaîne elle-même 'DA1234'
Comme vous voulez rechercher la valeur n'importe où dans le dataframe, vous pouvez remodeler les valeurs pour en faire une seule dimension Série:
DA1234
Avec vos données d'exemple, elle s'imprime simplement
s = pd.Series(df.values.reshape(len(df) * len(df.columns)))
s = s.loc[s.str.match(r'DA[0-9]{4}')]
if len(s) == 0:
print('Not found')
else:
print(s.iloc[0])