У меня есть dataframe в pandas, содержащий информацию, которую я хотел бы сортировать по группам на основе их id ('square'). Я хочу получить среднюю яркость для каждой группы, и на основе этой средней яркости я хочу скомпоновать данные в 4 категории и получить 4 выходных кадра данных.
Пример dataframe:
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)
Я не совсем уверен, как продолжать. Любая помощь ценится!
Вы можете использовать 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
plt.hist(avg, bins = 4)
проблем нет?