3
votes

Renvoie pandas.DataFrame lorsque la tranche a un résultat de ligne

Tenez compte de ce qui suit:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame(np.random.randn(5, 2), index=[100, 101, 101, 102, 103])
>>> idx = set(df.index)
>>> for id_ in idx:
...     slice = df.loc[id_]
...     # stuff with slice
>>>

J'ai besoin de faire des choses avec slice dans la boucle for mais ce truc est basé sur slice étant un DataFrame . slice est un DataFrame lorsqu'il y a plus d'un enregistrement correspondant, mais une Series dans le cas contraire. Je sais que pandas.Series a la méthode Series.to_frame mais pandas.DataFrame ne l'a pas (donc je ne peux pas simplement appeler df.loc [id _]. to_frame () ).

Quelle est la meilleure façon de tester et de forcer une tranche dans un DataFrame ? p>

(Est-ce vraiment aussi simple que de tester si isinstance (df.loc [id_], pd.Series) ?)


0 commentaires

3 Réponses :


1
votes

Vous pouvez boucler en groupby objet par index ( level = 0 ):

idx = set(df.index)
for id_ in idx:
    df1 = df.loc[[id_]]
    print (df1)

            0         1
100 -0.775057 -0.979104
            0         1
101 -1.549363 -1.206828
101  0.445008 -0.173086
            0        1
102  1.488947 -0.79252
            0         1
103  1.838997 -0.439362

Votre solution doit être modifiée en sélectionnant le double [] code > pour le retour DataFrame:

for i, df1 in df.groupby(level=0):
    print (df1)

            0         1
100 -0.812375 -0.450793
            0         1
101  1.070801  0.217421
101 -1.175859 -0.926117
            0         1
102 -0.993948  0.586806
            0         1
103  1.063813  0.237741


2 commentaires

Pourquoi la liste interne fonctionne-t-elle (c'est-à-dire transformer id_ en [id_] )?


@JasonStrimpel - Je ne sais pas si j'ai compris, mais les pandas travaillent df.loc [[id_]] comme sélectionner une valeur de liste, une solution similaire est si besoin, sélectionnez plusieurs valeurs de liste comme df.loc [ [id1, id2]]



1
votes

Ou utilisez df [...] conditionnement df.index:

            0         1
100  2.751189  1.978744
            0         1
101  0.154483  1.646657
101  1.381725  0.982819
           0         1
102  0.26669  0.032702
            0         1
103  0.186235 -0.481184

Output:

...
for id_ in idx:
     slice = df[df.index==id_]
     print(slice)


0 commentaires

0
votes

Vous pouvez forcer la variable slice à être un dataframe pandas en utilisant la méthode d'initialisation pd.Dataframe comme suit:

<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>

sortie:

for id_ in idx:
    slice = pd.DataFrame(df.loc[id_])
    print(type(slice))

Ensuite, vous pouvez traiter les variables comme des Dataframes à l'intérieur de la boucle.


0 commentaires