Comment décompresser une Série de n-uplets dans les Pandas?
Parfois je me retrouve avec une série de tuples, listes lors de l'utilisation de Pandas. Ce qui est commun lorsque, par exemple, faire un groupe et de passage d'une fonction à plusieurs valeurs de retour:
import numpy as np
from scipy import stats
df = pd.DataFrame(dict(x=np.random.randn(100),
y=np.repeat(list("abcd"), 25)))
out = df.groupby("y").x.apply(stats.ttest_1samp, 0)
print out
y
a (1.3066417476, 0.203717485506)
b (0.0801133382517, 0.936811414675)
c (1.55784329113, 0.132360504653)
d (0.267999459642, 0.790989680709)
dtype: object
Quelle est la façon correcte de "décompresser" de cette structure, de sorte que je reçois un DataFrame avec deux colonnes?
Une question connexe est de savoir comment je peux décompresser soit cette structure ou les résultats du dataframe en deux Séries/tableau d'objets. Cela fonctionne presque:
t, p = zip(*out)
mais il t
est
(array(1.3066417475999257),
array(0.08011333825171714),
array(1.557843291126335),
array(0.267999459641651))
et l'on doit prendre la peine de le presser.
df.groupby("y").x.apply(lambda x, y: pd.Series(stats.ttest_1samp(x, y), ['A', 'B']), 0).unstack()
est un peu bordélique (et nécessite de connaître la longueur de l'entrée.
Vous devez vous connecter pour publier un commentaire.
c'est peut-être plus strightforward (la plupart des pythonic je suppose):
si vous voulez renommer les colonnes à quelque chose de plus significatif, que:
si vous ne voulez pas le nom par défaut de l'index:
out.apply(pd.Series, index=["stat, "p"])
Series.apply(func)
retourne un DataFrame sifunc
renvoie une Série.out.apply(pd.Series, index=['stat', 'p'])
permettra de convertir chaque n-uplet dans une Série avec les 2 valeurs, et depuisout
a déjà un indice, la nouvelle Série de l'indice devient les noms de colonnepeut-être:
Je crois que vous voulez ce:
résultat:
out.apply(pd.Series)
. Dans mon cas, où les tuples sont des paires de chaînes (et j'ai de 4000 d'entre eux), il est 400 fois plus vite...J'ai rencontré le même problème. Ce que j'ai trouvé 2 façons de le résoudre sont exactement la réponse de @CT ZHU et celle de @Siraj S.
Voici mon information supplémentaire que vous pourriez être intéressé:
J'ai comparé 2 voies et trouvé le moyen de @CT ZHU effectue beaucoup plus rapidement lorsque la taille de l'entrée augmente.
Exemple:
PS: s'il vous Plaît pardonnez mon laide du code.