Comment accéder aux pandas groupby dataframe par clé
Comment puis-je accéder à la correspondante groupby dataframe dans un groupby objet par la clé? À la suite de groupby:
rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': rand.randn(6),
'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])
Je peux parcourir pour obtenir les clés et les groupes:
In [11]: for k, gp in gb:
print 'key=' + str(k)
print gp
key=bar
A B C
1 bar -0.611756 18
3 bar -1.072969 10
5 bar -2.301539 18
key=foo
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
Je voudrais être en mesure de faire quelque chose comme
In [12]: gb['foo']
Out[12]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
Mais quand je fais ça (bon, en fait j'ai à faire gb[('foo',)]
), j'ai cette bizarre pandas.core.groupby.DataFrameGroupBy
chose qui ne semble pas avoir des méthodes qui correspondent à la DataFrame je veux.
Le mieux je pense est de
In [13]: def gb_df_key(gb, key, orig_df):
ix = gb.indices[key]
return orig_df.ix[ix]
gb_df_key(gb, 'foo', df)
Out[13]:
A B C
0 foo 1.624345 5
2 foo -0.528172 11
4 foo 0.865408 14
mais c'est le genre de méchant, compte tenu de la façon agréable les pandas est généralement à ces choses.
Ce qui est intégré dans la façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
get_group
méthode:Remarque: Cela ne nécessite pas la création d'un intermédiaire dictionnaire /copie de chaque subdataframe pour chaque groupe, ce qui sera beaucoup plus efficace de la mémoire que de la création de la naïve dictionnaire avec
dict(iter(gb))
. C'est parce qu'il utilise des données-structures qui existent déjà dans le groupby objet.Vous pouvez sélectionner différents types de colonnes à l'aide de la groupby découpage:
Wes McKinney (pandas auteur) en Python pour l'Analyse des Données fournit la recette suivante:
qui retourne un dictionnaire dont les clés sont vos étiquettes de groupe et dont les valeurs sont DataFrames, c'est à dire
donnera ce que vous cherchez:
groups = dict(list(gb))
seule colonne storeC
? Disons que je ne suis pas intéressé dans les autres colonnes, et donc ne veulent pas les stocker.dict(list( df.groupby(['A'])['C'] ))
dict(iter(g))
. (bien queget_group
est le meilleur moyen de / comme il n'implique pas de créer un dictionnaire / vous maintient dans les pandas! 😀 )gb_dict = {str(indx): str(val) for indx in gb.indx for val in gb.some_key}
et ensuite récupérer la valeur pargb_dict[some_key]
Plutôt que
Je préfère utiliser
gb.groups
Parce que de cette façon, vous pouvez choisir plusieurs colonnes ainsi. par exemple:
gb[["A", "B"]].get_group("foo")
.Si vous êtes à la recherche sélective grouper les objets, puis, n': gb_groups.les touches () et d'entrées de clé souhaitée en key_list..
Je cherchais un moyen de prélever un échantillon de quelques membres de la GroupBy obj - a dû répondre à la question posée à obtenir ce fait.
créer groupby objet
pick N dataframes et de saisir leurs indicies
saisir les groupes
éventuellement tourner dans un seul dataframe objet