Topic: PANDAS somma e colonne  (Letto 227 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline tascio

  • python erectus
  • ***
  • Post: 193
  • Punti reputazione: 0
    • Mostra profilo
PANDAS somma e colonne
« il: Dicembre 02, 2022, 11:27 »
Raga ho un dataframe che vorrei raggruppare per una determinata colonna, sommare i valori di un'altra ma stampare anche le altre colonne. E quindi faccio così:

dataframe
            0                              1   2         3           4
0   BIO517318                THERCRON 80GR..  12     94B22  06/25/2024
1   BIO517318                THERCRON 80GR..   1      1D21  10/25/2023
2   BIO517318                THERCRON 80GR..  27     69C22  09/30/2024
3   SLA777118           MOTIX-D 60 CPR 1 gr.  24   M210259  11/30/2025
4   CAM152875             IMMUN 60 CPR 1 GR.  12    20M786  12/30/2023
5   CAM152912        SKIN ENERGY PLUS 20 ML.   2   L180216  01/01/1900
6   PHA999981           JGARD 80 CP. SOFTGEL  12  21007688  11/25/2024
7   PHA000014      NORMAPHOS PLUS XL  90 GR.   8    21M735  11/25/2024
8   TRE120189           IMMUNOV  PASTA 30GR.  12    067/22  05/31/2025
9   PHA999967  KPROTECT 120 TAV. MASTICABILE  12    22M049  01/25/2025
10  AUR652199         NEFROPIU' 30 CPR 1 GR.   7   M220072  04/30/2025
11   PHA99974           KPROTECT 45 GR POLV.   5    22M433  07/25/2025


l = dfp.groupby([0])[2].sum().reset_index()

 risultato
           0   2
0  AUR652199   7
1  BIO517318  40
2  CAM152875  12
3  CAM152912   2
4  PHA000014   8
5   PHA99974   5
6  PHA999967  12
7  PHA999981  12
8  SLA777118  24
9  TRE120189  12


Se inserisco anche le altre colonne ovviamente non me le ragruppa
l = dfp.groupby([0,1,3,4])[2].sum().reset_index()

risultato
            0                              1         3           4   2
0   AUR652199         NEFROPIU' 30 CPR 1 GR.   M220072  04/30/2025   7
1   BIO517318                THERCRON 80GR..      1D21  10/25/2023   1
2   BIO517318                THERCRON 80GR..     69C22  09/30/2024  27
3   BIO517318                THERCRON 80GR..     94B22  06/25/2024  12
4   CAM152875             IMMUN 60 CPR 1 GR.    20M786  12/30/2023  12
5   CAM152912        SKIN ENERGY PLUS 20 ML.   L180216  01/01/1900   2
6   PHA000014      NORMAPHOS PLUS XL  90 GR.    21M735  11/25/2024   8
7    PHA99974           KPROTECT 45 GR POLV.    22M433  07/25/2025   5
8   PHA999967  KPROTECT 120 TAV. MASTICABILE    22M049  01/25/2025  12
9   PHA999981           JGARD 80 CP. SOFTGEL  21007688  11/25/2024  12
10  SLA777118           MOTIX-D 60 CPR 1 gr.   M210259  11/30/2025  24
11  TRE120189           IMMUNOV  PASTA 30GR.    067/22  05/31/2025  12


C'è un modo per stampare anche le altre colonne dicendogli di mantenere una sola riga per colonna 0 e nelle altre colonne mantenere solo la prima occorrenza rispetto al numero di colonne esistenti?

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:PANDAS somma e colonne
« Risposta #1 il: Dicembre 02, 2022, 11:57 »
usa .agg, passando sum per una e first per le altre

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re:PANDAS somma e colonne
« Risposta #2 il: Dicembre 02, 2022, 12:13 »
Non conosco pandas ma, da curioso, guardando la docs proprio di ciò che suggerisce @glenhk avevo preparato un possibile esempio, giacché lo ho fatto, qualcosa così?
Python 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
import pandas
d = [['BIO517318', 'THERCRON 80GR..', 12, '94B22', '06/25/2024'],
['BIO517318', 'THERCRON 80GR..', 1, '1D21', '10/25/2023'],
['BIO517318', 'THERCRON 80GR..', 27, '69C22', '09/30/2024'],
['SLA777118', 'MOTIX-D 60 CPR 1 gr.', 24, 'M210259', '11/30/2025'],
['CAM152875', 'IMMUN 60 CPR 1 GR.', 12, '20M786', '12/30/2023'],
['CAM152912', 'SKIN ENERGY PLUS 20 ML.', 2, 'L180216', '01/01/1900'],
['PHA999981', 'JGARD 80 CP. SOFTGEL', 12, '21007688', '11/25/2024'],
['PHA000014', 'NORMAPHOS PLUS XL  90 GR.', 8, '21M735', '11/25/2024'],
['TRE120189', 'IMMUNOV  PASTA 30GR.', 12, '067/22', '05/31/2025'],
['PHA999967', 'KPROTECT 120 TAV. MASTICABILE', 12, '22M049', '01/25/2025'],
['AUR652199', 'NEFROPIU 30 CPR 1 GR.', 7, 'M220072', '04/30/2025'],
['PHA99974', 'KPROTECT 45 GR POLV.', 5, '22M433', '07/25/2025']]
c = [0, 1, 2, 3, 4]
df = pandas.DataFrame(d, columns=c)
print(df)
            0                              1   2         3           4
0   BIO517318                THERCRON 80GR..  12     94B22  06/25/2024
1   BIO517318                THERCRON 80GR..   1      1D21  10/25/2023
2   BIO517318                THERCRON 80GR..  27     69C22  09/30/2024
3   SLA777118           MOTIX-D 60 CPR 1 gr.  24   M210259  11/30/2025
4   CAM152875             IMMUN 60 CPR 1 GR.  12    20M786  12/30/2023
5   CAM152912        SKIN ENERGY PLUS 20 ML.   2   L180216  01/01/1900
6   PHA999981           JGARD 80 CP. SOFTGEL  12  21007688  11/25/2024
7   PHA000014      NORMAPHOS PLUS XL  90 GR.   8    21M735  11/25/2024
8   TRE120189           IMMUNOV  PASTA 30GR.  12    067/22  05/31/2025
9   PHA999967  KPROTECT 120 TAV. MASTICABILE  12    22M049  01/25/2025
10  AUR652199          NEFROPIU 30 CPR 1 GR.   7   M220072  04/30/2025
11   PHA99974           KPROTECT 45 GR POLV.   5    22M433  07/25/2025
df.groupby(0).agg({1: 'min',
                   2: 'sum',
                   3: 'min',
                   4: 'min'}).reset_index()
           0                              1   2         3           4
0  AUR652199          NEFROPIU 30 CPR 1 GR.   7   M220072  04/30/2025
1  BIO517318                THERCRON 80GR..  40      1D21  06/25/2024
2  CAM152875             IMMUN 60 CPR 1 GR.  12    20M786  12/30/2023
3  CAM152912        SKIN ENERGY PLUS 20 ML.   2   L180216  01/01/1900
4  PHA000014      NORMAPHOS PLUS XL  90 GR.   8    21M735  11/25/2024
5   PHA99974           KPROTECT 45 GR POLV.   5    22M433  07/25/2025
6  PHA999967  KPROTECT 120 TAV. MASTICABILE  12    22M049  01/25/2025
7  PHA999981           JGARD 80 CP. SOFTGEL  12  21007688  11/25/2024
8  SLA777118           MOTIX-D 60 CPR 1 gr.  24   M210259  11/30/2025
9  TRE120189           IMMUNOV  PASTA 30GR.  12    067/22  05/31/2025


PS - ovviamente, "first" mi era sfuggito :D
« Ultima modifica: Dicembre 02, 2022, 12:15 da nuzzopippo »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:PANDAS somma e colonne
« Risposta #3 il: Dicembre 05, 2022, 01:10 »
Sostanzialmente, sì.


Si può usare ovviamente min, max, first, ecc, dipende tutto da quello che si vuole. Anche funzioni come list o set se si vogliono raggruppare i valori.

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re:PANDAS somma e colonne
« Risposta #4 il: Dicembre 07, 2022, 16:35 »
Si può usare ovviamente min, max, first, ecc, dipende tutto da quello che si vuole. Anche funzioni come list o set se si vogliono raggruppare i valori.
Libreria ed indicazioni interessanti, anche se al di fuori del mio limitato quotidiano, avrei una curiosità : leggendo la docs /essenzialmente quella di "aggregate" e "transform" oltre che di "groupby") non mi è riuscito di individuare una esaustiva indicazione delle metodologie di aggregazione applicabili ed ho, per altro, avuto la sensazione che centri parecchio numpy in tali aggregazioni
... la domanda è : bisogna andare a studiarsi numpy (cosa da fare comunque) per chiarirsi tali aspetti o c'è un "settore" della docs particolare che tratta tali funzionalità? ... od anche, sono funzioni sparse in pandas che bisogna studiarsi singolarmente per capire quali siano applicabili in un raggruppamento?
« Ultima modifica: Dicembre 07, 2022, 16:49 da nuzzopippo »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:PANDAS somma e colonne
« Risposta #5 il: Dicembre 10, 2022, 12:07 »
No, puoi implementare quello che ti pare, basta che siano metodi di series o funzioni che restituiscono un valore da una serie.

Nella doc di aggregate dice:

Citazione
Function to use for aggregating the data. If a function, must either work when passed a DataFrame or when passed to DataFrame.apply.
Accepted combinations are:
- function
- string function name
- list of functions and/or function names, e.g. [np.sum, 'mean']
- dict of axis labels -> functions, function names or list of such.

Ad esempio:


In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'a': [1,2,3,4,5,6,7,8], 'b': [1,1,1,2,3,3,4,4]})

In [3]: df.groupby('b').agg({'a': lambda s: list(s.drop_duplicates())})
Out[3]:
           a
b
1  [1, 2, 3]
2        [4]
3     [5, 6]
4     [7, 8]

In [4]: df.groupby('b').agg({'a': lambda s: (s * 2).mean()})
Out[4]:
      a
b
1   4.0
2   8.0
3  11.0
4  15.0

In [5]: df.groupby('b').agg({'a': lambda s: s[s > 1].size})
Out[5]:
   a
b
1  2
2  1
3  2
4  2

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re:PANDAS somma e colonne
« Risposta #6 il: Dicembre 10, 2022, 15:08 »
Grazie, a buon rendere.

Avevo letto il passo di aggregate citato, purtroppo, la mia ignoranza dell'inglese mi pone in difficoltà, grazie degli esempi.