2
votes

Extraire une valeur unique d'une dataframe pandas

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']})


0 commentaires

4 Réponses :


3
votes

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()


2 commentaires

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!



1
votes

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)]


1 commentaires

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'



2
votes

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)]


2 commentaires

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'



0
votes

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])


0 commentaires