Разделить фрейм данных на несколько фреймов данных на основе уникальных комбинаций столбцов - PullRequest
1 голос
/ 29 марта 2020

У меня есть следующий фрейм данных:

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)

, который выглядит следующим образом:

? >>> 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

Мне нужно получить список фреймов данных из всех уникальных комбинаций единиц и мест, то есть то, что использует df.groupby(['units', 'locations']). Конечный результат должен выглядеть примерно так:

(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

возможно ли это, пожалуйста? Спасибо и будьте в безопасности!

Ответы [ 3 ]

1 голос
/ 29 марта 2020

другой метод заключается в использовании dict comp с groupby и 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
1 голос
/ 29 марта 2020

Запустить словарь понимания через группу. Вы можете узнать больше об этом на Pandas do c для groupby: split-apply-comb * page:

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 голосов
/ 29 марта 2020

вы правы, что это просто групповой:

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

Вывод:

(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...