2 votes

Itérer sur le DataFrame de Pandas et stocker les résultats

J'ai un DataFrame qui ressemble à ceci :

columns = ['C24H31O8', 'C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12','C19H11O13']

values= [[   0.,   37.,   74.,  111.,  148.,  185.],
         [ -37.,    0.,   37.,   74.,  111.,  148.],
         [ -74.,  -37.,    0.,   37.,   74.,  111.],
         [-111.,  -74.,  -37.,    0.,   37.,   74.],
         [-148., -111.,  -74.,  -37.,    0.,   37.],
         [-185., -148., -111.,  -74.,  -37.,    0.]]

Vous pouvez facilement recréer mon cadre de données en utilisant

df = pd.DataFrame(data=values, index=columns)

Je veux itérer sur mon cadre de données comme suit :

En itérant, dans la ligne C24H31O8 vous trouvez 37 dans la colonne numéro 1. Maintenant, allez à la ligne numéro 1 et itérez à nouveau. Si vous trouvez à nouveau le nombre 37 - dans ce cas, vous trouvez 37 dans la troisième colonne - allez à la troisième ligne et cherchez à nouveau 37, etc.

Le résultat que je souhaite obtenir est une chaîne :

37 : C24H31O9 --> C23H27O9 --> C22H23O10 --> C21H19O11 ...

(faire quelque chose pour chaque valeur)

0voto

CDJB Points 12533

Cela devrait fonctionner, si je comprends bien la question :

columns= pd.Index(['C24H31O8', 'C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12','C19H11O13'],dtype='object')

values=np.array([[   0.,   37.,   74.,  111.,  148.,  185.],
               [ -37.,    0.,   37.,   74.,  111.,  148.],
               [ -74.,  -37.,    0.,   37.,   74.,  111.],
               [-111.,  -74.,  -37.,    0.,   37.,   74.],
               [-148., -111.,  -74.,  -37.,    0.,   37.],
               [-185., -148., -111.,  -74.,  -37.,    0.]])

df = pd.DataFrame(values, columns)

def build_string(df, i):
    row = 0
    chain = df.index[0]
    while True:
        try:
            row = df.iloc[row][df.iloc[row] == i].index[0]
            chain += f"--> {df.index[row]}"
        except IndexError:
            break
    return chain

Sortie :

>>> build_string(df, 37)
'C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13'

ou

>>> {int(i): build_string(df, i) for i in df.iloc[0] if i > 0}
{37: 'C24H31O8--> C23H27O9--> C22H23O10--> C21H19O11--> C20H15O12--> C19H11O13',
 74: 'C24H31O8--> C22H23O10--> C20H15O12',
 111: 'C24H31O8--> C21H19O11',
 148: 'C24H31O8--> C20H15O12',
 185: 'C24H31O8--> C19H11O13'}

0voto

Quang Hoang Points 191

IIUC :

df = pd.DataFrame(values, columns = columns)
s = df.where(df>0).stack()
out_dict = s.index.get_level_values(1).groupby(s)

Sortie ( out_dict ):

{37.0: Index(['C23H27O9', 'C22H23O10', 'C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
 74.0: Index(['C22H23O10', 'C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
 111.0: Index(['C21H19O11', 'C20H15O12', 'C19H11O13'], dtype='object'),
 148.0: Index(['C20H15O12', 'C19H11O13'], dtype='object'),
 185.0: Index(['C19H11O13'], dtype='object')}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X