Je commence avec des données d'entrée comme celle-ci
df1 = pandas.DataFrame( {
"Name" : ["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"] ,
"City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] } )
Qui, une fois imprimé, apparaît comme ceci:
City Name
0 Seattle Alice
1 Seattle Bob
2 Portland Mallory
3 Seattle Mallory
4 Seattle Bob
5 Portland Mallory
Le regroupement est assez simple:
g1 = df1.groupby( [ "Name", "City"] ).count()
et l'impression donne un GroupBy
objet:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Seattle 1 1
Mais ce que je veux finalement, c'est un autre objet DataFrame qui contient toutes les lignes de l'objet GroupBy. En d'autres termes, je veux obtenir le résultat suivant:
City Name
Name City
Alice Seattle 1 1
Bob Seattle 2 2
Mallory Portland 2 2
Mallory Seattle 1 1
Je ne vois pas comment accomplir cela dans la documentation des pandas. Tout indice serait le bienvenu.
Empty DataFrame
Columns: []
Index: [(Alice, Seattle), (Bob, Seattle), (Mallory, Portland), (Mallory, Seattle)]
Réponses:
g1
ici est une trame de données. Il a cependant un index hiérarchique:Peut-être que vous voulez quelque chose comme ça?
Ou quelque chose comme:
la source
reset.index()
fait le travail, super!df1.groupby( [ "Name", "City"] ).size().to_frame(name = 'count').reset_index()
.reset_index()
me semble être le meilleur moyen de joindre la sortie à partir de laquelle vous obtiendrezdf.groupby('some_column').apply(your_custom_func)
. Ce n'était pas intuitif pour moi.pandas.core.groupby.DataFrameGroupBy
objet, nonpandas.core.frame.DataFrame
.Je veux changer légèrement la réponse donnée par Wes, car la version 0.16.2 l'exige
as_index=False
. Si vous ne le définissez pas, vous obtenez une trame de données vide.Source :
ÉDITER:
Dans la version
0.17.1
et les versions ultérieures, vous pouvez utilisersubset
danscount
etreset_index
avec le paramètrename
insize
:La différence entre
count
etsize
est celle quisize
compte les valeurs de NaN alors que cecount
n'est pas le cas.la source
df1.groupby( [ "Name", "City"]).size().reset_index(name="count")
as_index=False' stopped working in latest versions? I also tried to run
df1.groupby (["Nom", "Ville"], as_index = False) .size () `mais cela n'affecte pas le résultat (probablement parce que le résultat du regroupement n'estSeries
pasDataFrame
groupby
par ces colonnes. Mais je ne suis pas sûr, car je ne suis pas développeur de pandas.Simplement, cela devrait faire la tâche:
Ici,
grouped_df.size()
récupère le nombre unique de groupes et lareset_index()
méthode réinitialise le nom de la colonne que vous souhaitez qu'elle soit. Enfin, laDataframe()
fonction pandas est appelée pour créer un objet DataFrame.la source
La clé est d'utiliser la méthode reset_index () .
Utilisation:
Vous avez maintenant votre nouvelle trame de données dans g1 :
la source
Peut-être ai-je mal compris la question, mais si vous souhaitez reconvertir le groupe en un cadre de données, vous pouvez utiliser .to_frame (). Je voulais réinitialiser l'index lorsque je l'ai fait, j'ai donc également inclus cette partie.
exemple de code sans rapport avec la question
la source
J'ai trouvé que cela fonctionnait pour moi.
la source
La solution ci-dessous peut être plus simple:
la source
J'ai agrégé avec des données sages et stocké dans une trame de données
la source
Ces solutions n'ont fonctionné que partiellement pour moi car je faisais plusieurs agrégations. Voici un exemple de sortie de mon groupe par que je voulais convertir en trame de données:
Parce que je voulais plus que le nombre fourni par reset_index (), j'ai écrit une méthode manuelle pour convertir l'image ci-dessus en une trame de données. Je comprends que ce n'est pas la façon la plus pythonique / pandas de le faire car elle est assez verbeuse et explicite, mais c'était tout ce dont j'avais besoin. Fondamentalement, utilisez la méthode reset_index () expliquée ci-dessus pour démarrer un cadre de données "d'échafaudage", puis parcourez les paires de groupes dans le cadre de données groupé, récupérez les indices, effectuez vos calculs par rapport au cadre de données non groupé et définissez la valeur dans votre nouveau cadre de données agrégé .
Si un dictionnaire n'est pas votre truc, les calculs pourraient être appliqués en ligne dans la boucle for:
la source