Объединить двумерный массив сгруппированных по значениям в столбце - PullRequest
0 голосов
/ 13 октября 2018

У меня есть этот массив:

[['Burgundy Bichon Frise' '1' '137']
['Pumpkin Pomeranian' '1' '182']
['Purple Puffin' '1' '125']
['Wisteria Wombat' '1' '109']
['Burgundy Bichon Frise' '2' '168']
['Pumpkin Pomeranian' '2' '141']
['Purple Puffin' '2' '143']
['Wisteria Wombat' '2' '167']
['Burgundy Bichon Frise' '3' '154']
['Pumpkin Pomeranian' '3' '175']
['Purple Puffin' '3' '128']
['Wisteria Wombat' '3' '167']]

Первый индекс содержит названия животного, второй - регион, в котором он расположен, а третий - популяция.Мне нужно получить среднее значение видов в каждом регионе и получить максимум и минимум каждого вида в каждом регионе.Таким образом, для "Фиолетовых тупиков" среднее значение должно быть (125 + 143 + 128) / 3 = 132 .

Я очень запутался в том, как заставить массив numpy рассчитывать только на счетнаселение на регион.

Было бы лучше или проще разделить этот 2d массив на несколько 2d массивов?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вот как преобразовать данные a в 2D-таблицу, используя numpy:

>>> unqr, invr = np.unique(a[:, 0], return_inverse=True)
>>> unqc, invc = np.unique(a[:, 1], return_inverse=True)
# initialize with nans in case there are missing values
# these are then treated correctly by nanmean etc.:
>>> out = np.full((unqr.size, unqc.size), np.nan)
>>> out[invr, invc] = a[:, 2]
>>> 
# now we have a table
>>> out
array([[137., 168., 154.],
       [182., 141., 175.],
       [125., 143., 128.],
       [109., 167., 167.]])
# with rows
>>> unqr
array(['Burgundy Bichon Frise', 'Pumpkin Pomeranian', 'Purple Puffin',
       'Wisteria Wombat'], dtype='<U21')
# and columns
>>> unqc
array(['1', '2', '3'], dtype='<U21')
>>> 
# find the mean for 'Purple Puffin':
>>> np.nanmean(out[unqr.searchsorted('Purple Puffin')])
132.0
# find the max for region '2'
>>> np.nanmax(out[:, unqc.searchsorted('2')])
168.0
0 голосов
/ 13 октября 2018

Это больше похоже на задачу для панд, сначала мы можем построить кадр данных:

import pandas as pd

df = pd.DataFrame([
    ['Burgundy Bichon Frise','1','137'],
    ['Pumpkin Pomeranian','1','182'],
    ['Purple Puffin','1','125'],
    ['Wisteria Wombat','1','109'],
    ['Burgundy Bichon Frise','2','168'],
    ['Pumpkin Pomeranian','2','141'],
    ['Purple Puffin','2','143'],
    ['Wisteria Wombat','2','167'],
    ['Burgundy Bichon Frise','3','154'],
    ['Pumpkin Pomeranian','3','175'],
    ['Purple Puffin','3','128'],
    ['Wisteria Wombat','3','167']], columns=['animal', 'region', 'n'])

Затем мы можем преобразовать region и n в числа, это облегчит вычисление статистики:

df.region = pd.to_numeric(df.region)
df.n = pd.to_numeric(df.n)

Наконец, мы можем выполнить .groupby(..) и затем вычислить агрегат, например:

>>> df[['animal', 'n']].groupby(('animal')).min()
                         n
animal                    
Burgundy Bichon Frise  137
Pumpkin Pomeranian     141
Purple Puffin          125
Wisteria Wombat        109
>>> df[['animal', 'n']].groupby(('animal')).max()
                         n
animal                    
Burgundy Bichon Frise  168
Pumpkin Pomeranian     182
Purple Puffin          143
Wisteria Wombat        167
>>> df[['animal', 'n']].groupby(('animal')).mean()
                                n
animal                           
Burgundy Bichon Frise  153.000000
Pumpkin Pomeranian     166.000000
Purple Puffin          132.000000
Wisteria Wombat        147.666667

Редактировать : получить минимальную строку за animal

Мы можем использовать idxmin / idxmax, чтобы получить номера индексов для самых маленьких / самых больших строк на животное, а затем использовать df.iloc[..], чтобы получить эти строки, например:

>>> df.ix[df.groupby(('animal'))['n'].idxmin()]
                  animal  region    n
0  Burgundy Bichon Frise       1  137
5     Pumpkin Pomeranian       2  141
2          Purple Puffin       1  125
3        Wisteria Wombat       1  109
>>> df.ix[df.groupby(('animal'))['n'].idxmax()]
                  animal  region    n
4  Burgundy Bichon Frise       2  168
1     Pumpkin Pomeranian       1  182
6          Purple Puffin       2  143
7        Wisteria Wombat       2  167

Здесь 0, 5, 2, 3 (для idxmin) - «номера строк» ​​кадра данных.

...