Pandas Группировка диапазонов, когда диапазоны не являются непрерывными - PullRequest
1 голос
/ 18 июня 2020

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

id    |   A   |   B   |   C
------------------------------
1     |  0.1  |  1.2  |  100    
2     |  0.2  |  1.4  |  200    
3     |  0.3  |  1.6  |  300    
4     |  0.4  |  1.8  |  400    
5     |  0.5  |  2.0  |  500
6     |  0.6  |  2.2  |  600    
7     |  0.7  |  2.4  |  700    
8     |  0.8  |  2.6  |  800    
9     |  0.9  |  2.8  |  900    
10    |  1.0  |  3.0  |  1000    
11    |  1.1  |  3.2  |  1100    

Я хочу использовать groupby для этого фрейма данных, чтобы сгруппировать его по диапазону приращений для столбца «A» или «B». Но диапазоны не являются последовательными и не исключающими, они выглядят так:

(0,1.1.1]
(0.2,1.1]
(0.4,1.1]
(0.6,1.1]
(0.8,1.1]
(1.0,1.1]

Затем примените некоторые функции (среднее и сумма), поэтому мой конечный результат будет примерно таким:

          | A_mean | B_mean | C_sum
A_bins    |        |        |  
-------------------------------------
(0,1.1.1] |  0.6   |  2.2   | 6600
(0.2,1.1] |  0.7   |  2.4   | 6300
(0.4,1.1] |  0.8   |  2.6   | 5600
(0.6,1.1] |  0.9   |  2.8   | 4500
(0.8,1.1] |  1.0   |  3.0   | 3000
(1.0,1.1] |  1.1   |  3.2   | 1100

Я думал попробовать groupby с pd.cut(), но думаю, pd.cut() не сможет работать с этими интервалами.

Итак, могу ли я как-нибудь добиться этого? с такими диапазонами? Или любые диапазоны, которые не имеют форму чего-то вроде: np.arange(0, 1.1+0.05, 0.2)

Всем спасибо

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете попробовать транспонировать его, а затем попробовать функцию диапазона, если он существует (я никогда не использовал range () и не могу сейчас проверить):

df.T.range()

Вместо того, чтобы означать, вы можете попробуйте описать () или min () / max ().

0 голосов
/ 18 июня 2020

Как насчет того, чтобы просто использовать функцию apply для генерации необходимых вам показателей.

df2 = pd.DataFrame({'A_bins': [(0.1,1.1), (0.2,1.1), (0.4,1.1), (0.6,1.1), (0.8,1.1), (1.0,1.1)]})

def get_sum(row): # this is where the logic for your metrics goes
   return df.loc[(row['A_bins'][0]<df['A']) & (row['A_bins'][1]>=df['A']),'C'].sum()

df2['C_sum'] = df2.apply(get_sum, axis = 1)
print (df2)

Вывод:

       A_bins   C_sum
0  (0.1, 1.1)  6500.0
1  (0.2, 1.1)  6300.0
2  (0.4, 1.1)  5600.0
3  (0.6, 1.1)  4500.0
4  (0.8, 1.1)  3000.0
5  (1.0, 1.1)  1100.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...