1
votes

Diviser le bloc de données en plusieurs blocs de données en fonction de combinaisons de colonnes uniques

J'ai le bloc de données suivant:

(1, 30)
   timestamps  quantities
0           1           1
1           2           5
2           3           3

(5, 32)
   timestamps  quantities
3           1          10
4           2          35
5           3          39

qui ressemble à ceci:

🐍 >>> df
   units  locations  timestamps  quantities
0      1         30           1           1
1      1         30           2           5
2      1         30           3           3
3      5         32           1          10
4      5         32           2          35
5      5         32           3          39

J'ai besoin d'une liste de blocs de données de toutes les combinaisons uniques d'unités et d'emplacements, c'est-à-dire quelque chose qui utilise df.groupby (['units', 'locations']) . Le résultat final devrait ressembler à ceci:

import pandas as pd

units = [1, 1, 1, 5, 5, 5]
locations = [30, 30, 30, 32, 32, 32]
timestamps = [1, 2, 3, 1, 2, 3]
quantities = [1, 5, 3, 10, 35, 39]
data = {'units': units, 'locations': locations, 'timestamps': timestamps,
        'quantities': quantities}
df = pd.DataFrame(data=data)

est-ce possible, s'il vous plaît?


0 commentaires

3 Réponses :


1
votes

Exécutez une compréhension du dictionnaire à travers le groupby. Pour en savoir plus, consultez le document Pandas pour page groupby: fractionner-appliquer-combiner :

d = {name:group.filter(['timestamps','quantities']) 
     for name, group in df.groupby(['units','locations'])}

#print(d.keys())
#dict_keys([(1, 30), (5, 32)])

print(d[(1,30)])

    timestamps  quantities
0       1           1
1       2           5
2       3           3

 print(d[(5,32)])

  timestamps    quantities
3       1          10
4       2          35
5       3          39


0 commentaires

1
votes

une autre méthode consiste à utiliser dict comp avec groupby et concat

d = pd.concat(({combo : data for combo,data in df.groupby(['units','locations'])}))

print(d)

        units  locations  timestamps  quantities
1 30 0      1         30           1           1
     1      1         30           2           5
     2      1         30           3           3
5 32 3      5         32           1          10
     4      5         32           2          35
     5      5         32           3          39


0 commentaires

0
votes

vous avez raison, il s'agit simplement de groupby:

(1, 30)
   timestamps  quantities
0           1           1
1           2           5
2           3           3
(5, 32)
   timestamps  quantities
3           1          10
4           2          35
5           3          39

Sortie:

cols = ['units','locations']
for k, d in df.drop(cols, axis=1).groupby([df[c] for c in cols]):
    print(k)
    print(d)


0 commentaires