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?
3 Réponses :
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
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
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)