2017-02-04 3 views
0

У меня есть два множества наборов данных (порядка 10) с различной длиной (каждая строка - это запись), которые должны быть равны числу строк: критерием является binning по нескольким столбцам, от 2 до 4, а затем удалите превышающие записи в одном из двух наборов данных (произвольно выбирая между всеми записями в этом бункере).python: удалять записи из набора данных, сравнивая две гистограммы

настоящее время я использую NumPy, но было бы хорошо использовать панд а.

Поскольку я знаю заранее, один набор данных меньше, чем другой. Моя (наивная, позвольте мне сказать) идея состоит в том, чтобы вычислить две гистограммы (сначала меньшие), вычесть один из другого, чтобы иметь различия в каждом ящике, прогулку наборы данных для удаления превышения записей, НО: Я должен знать, какая запись находится в каком-то бункере!

Фрагмент кода для вычисления гистограмм в python (два набора данных столбцов для простоты):

import numpy as np 
import numpy.random as rd 
x = 50*rd.random((100, 5)) 
np.histogram2d(x[:, 0], x[:, 1], bins=[10, 5]) 

Есть ли способ, чтобы следить за индексы набора данных при биннинге? Я знаю pandas Кадры данных могут иметь индексы, поэтому они могут быть естественным выбором, если Я придерживаюсь этого алгоритма.

Есть ли более умный способ сделать это, изменив алгоритм, но придерживаясь python?

+0

делает [numpy.digitize] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html) help? –

ответ

0

Я нашел хорошее решение, используя pandas.

import pandas as pd, numpy as np 
x = 50 * np.random.randn(50, 5) 
dfx = pd.DataFrame(x) 
bins = np.linspace(min(dfx[0]), max(dfx[0]), 10) 
first_binning = pd.cut(dfx[0], bins) 
bins = np.linspace(min(dfx[1]), max(dfx[1]), 5) 
second_binning = pd.cut(ddx[1], bins) 
groups = dfx.groupby([first_binning, second_binning]) 

и теперь вы можете сделать (в зависимости от ваших данных):

In [160]: groups.size() 
Out[160]: 
0     1 
(-101.273, -71.403] (50.481, 109.902]  2 
(-71.403, -41.532] (-68.362, -8.94]  4 
        (-8.94, 50.481]  3 
        (50.481, 109.902]  1 
(-41.532, -11.661] (-68.362, -8.94]  4 
        (-8.94, 50.481]  3 
        (50.481, 109.902]  2 
(-11.661, 18.21]  (-127.783, -68.362] 2 
        (-8.94, 50.481]  6 
        (50.481, 109.902]  1 
(18.21, 48.0806]  (-127.783, -68.362] 2 
        (-68.362, -8.94]  5 
        (-8.94, 50.481]  3 
        (50.481, 109.902]  3 
(48.0806, 77.951] (-68.362, -8.94]  2 
        (-8.94, 50.481]  4 
(77.951, 107.822] (-68.362, -8.94]  1 
dtype: int64 

видеть отсчеты и

In [163]: groups.indices 
Out[163]: 
{('(-101.273, -71.403]', '(50.481, 109.902]'): array([20, 37]), 
('(-11.661, 18.21]', '(-127.783, -68.362]'): array([26, 39]), 
('(-11.661, 18.21]', '(-8.94, 50.481]'): array([ 4, 14, 18, 34, 35,  45]), 
('(-11.661, 18.21]', '(50.481, 109.902]'): array([17]), 
('(-41.532, -11.661]', '(-68.362, -8.94]'): array([ 3, 13, 16, 30]), 
('(-41.532, -11.661]', '(-8.94, 50.481]'): array([25, 38, 48]), 
('(-41.532, -11.661]', '(50.481, 109.902]'): array([0, 5]), 
('(-71.403, -41.532]', '(-68.362, -8.94]'): array([ 1, 24, 32, 47]), 
('(-71.403, -41.532]', '(-8.94, 50.481]'): array([ 6, 19, 31]), 
('(-71.403, -41.532]', '(50.481, 109.902]'): array([12]), 
('(18.21, 48.0806]', '(-127.783, -68.362]'): array([21, 46]), 
('(18.21, 48.0806]', '(-68.362, -8.94]'): array([ 2, 15, 22, 33, 40]), 
('(18.21, 48.0806]', '(-8.94, 50.481]'): array([ 7, 28, 36]), 
('(18.21, 48.0806]', '(50.481, 109.902]'): array([ 9, 23, 49]), 
('(48.0806, 77.951]', '(-68.362, -8.94]'): array([41, 42]), 
('(48.0806, 77.951]', '(-8.94, 50.481]'): array([27, 29, 43, 44]), 
('(77.951, 107.822]', '(-68.362, -8.94]'): array([11])} 

, чтобы увидеть набор данных рекордных показателей, конечно.

Смежные вопросы