Разделить фрейм данных на несколько фреймов на основе группирования и биннинга - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть данные в пандах, содержащие информацию, которую я хотел бы отсортировать по группам на основе их идентификатора («квадрат»).Я хочу получить среднюю яркость для каждой группы, и на основе этой средней яркости я хочу разбить кадр данных на 4 категории и получить 4 выходных кадра данных.

Пример кадра данных:

squares = pd.DataFrame({'square': {0: 1.0, 1: 1.0, 2: 2.0, 3: 2.0, 4: 5.0, 5: 6.0, 6: 7.0, 7: 8.0},
                    'time': {0: 1.0, 1: 2.0, 2: 1.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 5.0 },
                    'x': {0: 243, 1: 293, 2: 189, 3: 189, 4: 176, 5: 374, 6: 111, 7: 239},
                    'y': {0: 233, 1: 436, 2: 230, 3: 233, 4: 203, 5: 394, 6: 171, 7: 284}, 
                    'brightness': {0: 1000, 1: 1200, 2: 4000, 3: 5000, 4: 2000, 5: 8000, 6: 1300, 7: 4300 }})

squares = squares.set_index('time')
squares


      brightness     square     x     y 
time
1.0     1000          1.0       243   233
2.0     1200          1.0       293   436
1.0     4000          2.0       189   230
2.0     5000          2.0       189   233
3.0     2000          5.0       176   203
3.0     6000          6.0       374   394 
4.0     1300          7.0       111   171
5.0     4300          8.0       239   284

Желаемый конечный результат:

squares_1

      brightness     square     x     y 
time
1.0     1000          1.0       243   233
2.0     1200          1.0       293   436
3.0     2000          5.0       176   203
4.0     1300          7.0       111   171


squares_2

NaN


squares_3

      brightness     square     x     y 
time
1.0     4000          2.0       189   230
2.0     5000          2.0       189   233
5.0     4300          8.0       239   284


squares_4

      brightness     square     x     y 
time
3.0     6000          6.0       374   394 

Я начал со следующего:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

avg = squares.groupby('square')['brightness'].mean()
n, bins, patches = plt.hist(avg, bins = 4)
inds = np.digitize(avg, bins)

Хотя я не совсем уверен, как продолжить.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете использовать GroupBy.transform с mean для нового Series с тем же размером, что и исходный DataFrame, затем для биннинга cut и последнего создания dictionary of DataFrame s:

squares = squares.set_index('time')

labs = [f'squares_{x+1}' for x in range(4)]
g = pd.cut(squares.groupby('square')['brightness'].transform('mean'), bins=4, labels=labs)
print (g)
time
1.0    squares_1
2.0    squares_1
1.0    squares_2
2.0    squares_2
3.0    squares_1
3.0    squares_4
4.0    squares_1
5.0    squares_2
Name: brightness, dtype: category
Categories (4, object): [squares_1 < squares_2 < squares_3 < squares_4]

dfs = dict(tuple(squares.groupby(g)))

print (dfs)
{'squares_1':       square    x    y  brightness
time                              
1.0      1.0  243  233        1000
2.0      1.0  293  436        1200
3.0      5.0  176  203        2000
4.0      7.0  111  171        1300, 'squares_2':       square    x    y  brightness
time                              
1.0      2.0  189  230        4000
2.0      2.0  189  233        5000
5.0      8.0  239  284        4300, 'squares_3': Empty DataFrame
Columns: [square, x, y, brightness]
Index: [], 'squares_4':       square    x    y  brightness
time                              
3.0      6.0  374  394        8000}

print (dfs['squares_1'])
      square    x    y  brightness
time                              
1.0      1.0  243  233        1000
2.0      1.0  293  436        1200
3.0      5.0  176  203        2000
4.0      7.0  111  171        1300

print (dfs['squares_2'])
      square    x    y  brightness
time                              
1.0      2.0  189  230        4000
2.0      2.0  189  233        5000
5.0      8.0  239  284        4300

print (dfs['squares_3'])
Empty DataFrame
Columns: [square, x, y, brightness]
Index: []

print (dfs['squares_4'])
      square    x    y  brightness
time                              
3.0      6.0  374  394        8000
...