J'ai la trame de données suivante, je veux trouver l'index pour la cellule qui commence par une certaine chaîne.

Exemple :

Price   | Rate p/lot |  Total Comm|
 947.2      1.25        BAM 1.25

 129.3      2.1         NAD 1.25

 161.69     0.8         CAD 2.00

Si je recherche ['NAD']: -

Production attendue:-

(1,2)
4
Piyush S. Wanare 13 avril 2018 à 13:40

3 réponses

Meilleure réponse

Utilisez applymap avec { {X1}}:

i, j = (df.applymap(lambda x: str(x).startswith('NAD'))).values.nonzero()
t = list(zip(i, j))
print (t)
[(1, 2)]

Pour la liste des valeurs d'entrée, utilisez:

L = ['NAD','BAM']
i, j = (df.applymap(lambda x: str(x).startswith(tuple(L)))).values.nonzero()
t = list(zip(i, j))
print (t)

[(0, 2), (1, 2)]
1
jezrael 13 avril 2018 à 12:03

Vous pouvez le faire efficacement avec numpy.argwhere:

import pandas as pd, numpy as np

df = pd.DataFrame([[947.2, 1.25, 'BAM 1.25'],
                   [129.3, 2.1, 'NAD 1.25'],
                   [161.69, 0.8, 'CAD 2.00']],
                  columns=['Price', 'Rate p/lot', 'Total Comm'])

res = np.argwhere(df.values.astype('<U3') == 'NAD')

# array([[1, 2]], dtype=int64)

Cela vous donne un tableau de coordonnées où votre condition correspond.

Pour obtenir un seul tuple:

res = next(map(tuple, np.argwhere(df.values.astype('<U3') == 'NAD')))

# (1, 2)

Pour une liste de chaînes:

res = list(map(tuple, np.argwhere(np.logical_or.reduce(\
      [df.values.astype('<U3') == i for i in np.array(['BAM', 'NAD'])]))))
1
jpp 13 avril 2018 à 12:07

Pour référence si quelqu'un veut chercher la position de la cellule contient une sous-chaîne.

import pandas as pd

df = pd.DataFrame([[947.2, 1.25, 'BAM 1.25'],
                   [129.3, 2.1, '$ 1.25'],
                   [161.69, '0.8 $', 'CAD 2.00']],
                  columns=['Price', 'Rate p/lot', 'Total Comm'])


row, column = (df.applymap(lambda x: x if ('$') in str(x) else None )).values.nonzero()
t = list(zip(row,column))
0
Piyush S. Wanare 16 avril 2018 à 07:03