web-dev-qa-db-fra.com

Les pandas se groupent en to_csv

Voulez-vous sortir une image de groupe de pandas par CSV. Essayé diverses solutions StackOverflow mais elles n’ont pas fonctionné. 

Python 3.6.1, Pandas 0.20.1

le résultat groupby ressemble à: 

id  month   year    count
week                
0   9066    82  32142   895
1   7679    84  30112   749
2   8368    126 42187   872
3   11038   102 34165   976
4   8815    117 34122   767
5   10979   163 50225   1252
6   8726    142 38159   996
7   5568    63  26143   582

Vous voulez un CSV qui ressemble à

week  count
0   895
1   749
2   872
3   976
4   767
5   1252
6   996
7   582

Code actuel:

week_grouped = df.groupby('week')
week_grouped.sum() #At this point you have the groupby result
week_grouped.to_csv('week_grouped.csv') #Can't do this - .to_csv is not a df function. 

Lire les solutions SO:

groupe de sortie en fichier csv pandas

week_grouped.drop_duplicates().to_csv('week_grouped.csv')

Résultat: AttributeError: impossible d'accéder aux attributs duplicables des objets 'DataFrameGroupBy', essayez d'utiliser la méthode 'apply'.

Pandas Python - écriture groupe par sortie dans un fichier

week_grouped.reset_index().to_csv('week_grouped.csv')

Résultat: AttributeError: "Impossible d'accéder à l'attribut appelable 'reset_index' des objets 'DataFrameGroupBy', essayez d'utiliser la méthode 'apply'"

5
kalmdown

Essayez de faire ceci:

week_grouped = df.groupby('week')
week_grouped.sum().reset_index().to_csv('week_grouped.csv')

Cela va écrire le dataframe entier dans le fichier. Si vous voulez seulement ces deux colonnes alors, 

week_grouped = df.groupby('week')
week_grouped.sum().reset_index()[['week', 'count']].to_csv('week_grouped.csv')

Voici une explication ligne par ligne du code original:

# This creates a "groupby" object (not a dataframe object) 
# and you store it in the week_grouped variable.
week_grouped = df.groupby('week')

# This instructs pandas to sum up all the numeric type columns in each 
# group. This returns a dataframe where each row is the sum of the 
# group's numeric columns. You're not storing this dataframe in your 
# example.
week_grouped.sum() 

# Here you're calling the to_csv method on a groupby object... but
# that object type doesn't have that method. Dataframes have that method. 
# So we should store the previous line's result (a dataframe) into a variable 
# and then call its to_csv method.
week_grouped.to_csv('week_grouped.csv')

# Like this:
summed_weeks = week_grouped.sum()
summed_weeks.to_csv('...')

# Or with less typing simply
week_grouped.sum().to_csv('...')
6
Alex Luis Arias

Essayez de changer votre deuxième ligne en week_grouped = week_grouped.sum() et de relancer les trois lignes.

Si vous exécutez week_grouped.sum() dans sa propre cellule de bloc-notes Jupyter, vous verrez comment l'instruction renvoie la sortie vers la sortie de la cellule, au lieu de réattribuer le résultat à week_grouped. Certaines méthodes de pandas ont un argument inplace=True (par exemple, df.sort_values(by=col_name, inplace=True)), mais sum n'en a pas.

EDIT: chaque numéro de semaine n'apparaît-il qu'une seule fois dans votre CSV? Si tel est le cas, voici une solution plus simple qui n’utilise pas groupby:

df = pd.read_csv('input.csv')
df[['id', 'count']].to_csv('output.csv')
2
Peter Leimbigler

Je pense qu'il n'est pas nécessaire d'utiliser un groupe, vous pouvez simplement supprimer les colonnes que vous ne voulez pas aussi. 

df = df.drop(['month','year'],axis==1)
df.reset_index()
df.to_csv('Your path')
0
Lucas Dresl

Regrouper par renvoie clé, paires de valeurs où clé est l'identifiant du groupe et la valeur, le groupe lui-même, c'est-à-dire un sous-ensemble d'un df d'origine correspondant à la clé.

Dans votre exemple, week_grouped = df.groupby('week') est un ensemble de groupes (objet pandas.core.groupby.DataFrameGroupBy) que vous pouvez explorer en détail de la manière suivante:

for k, gr in week_grouped:
    # do your stuff instead of print
    print(k)
    print(type(gr)) # This will output <class 'pandas.core.frame.DataFrame'>
    print(gr)
    # You can save each 'gr' in a csv as follows
    gr.to_csv('{}.csv'.format(k))

Ou bien vous pouvez calculer la fonction d'agrégation sur votre objet groupé

result = week_grouped.sum()
# This will be already one row per key and its aggregation result
result.to_csv('result.csv') 

Dans votre exemple, vous devez affecter le résultat de la fonction à une variable car, par défaut, les objets pandas sont immuables.

some_variable = week_grouped.sum() 
some_variable.to_csv('week_grouped.csv') # This will work

essentiellement result.csv et week_grouped.csv sont censés être les mêmes

0
Revaz