Образцы панд на основе словаря - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь сэмплировать DataFrame для панд на основе словаря и определенного столбца.Таким образом, для каждого значения столбца y я точно знаю, сколько наблюдений я бы хотел выбрать.

Я могу сделать это с помощью комбо groupby apply, например:

import pandas as pd

df = pd.DataFrame({'y': [2,2,0,0,0,1,1,1,1,1], 'x': 1, 'z': 2})

    y   x   z
0   2   1   2
1   2   1   2
2   0   1   2
3   0   1   2
4   0   1   2
5   1   1   2

sizes = {0: 2, 1: 1, 2:1}

df.groupby('y').apply(lambda x: x.sample(sizes[x['y'].values[0]]))

yyxz

0 2 0 1 2 4 0 1 2 1 5 1 1 2 2 0 2 1 2

Однако, если я сделаю unique вместо values (которыйдолжно быть эквивалентно, я получаю странную KeyError: 'y' ошибку на фрейме данных:

df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]]))

Может кто-нибудь объяснить, почему это происходит?

РЕДАКТИРОВАТЬ:

Это произошло на0.23.1 но не на 0.23.1, так что это, вероятно, ошибка.

1 Ответ

0 голосов
/ 27 ноября 2018

Я думаю, вам нужен атрибут .name:

df1 = df.groupby('y').apply(lambda x: x.sample(sizes[x.name]))
print (df1)

     y  x  z
y           
0 4  0  1  2
  2  0  1  2
1 6  1  1  2
2 0  2  1  2

Если возможно, какое-то значение не соответствует в словаре, используйте get с 0 для несоответствующих значений:

df1 = df.groupby('y').apply(lambda x: x.sample(sizes.get(x.name, 0)))

РЕДАКТИРОВАТЬ:

Проблема в unique вернуть один элемент numpy массив:

def f(x):
    print (x['y'].unique())
    print (x['y'].unique()[0])
    print (sizes[x['y'].unique()[0]])
    print (x.sample(sizes[x['y'].unique()[0]]))

df1 = df.groupby('y').apply(f)

[0]
0
2
   y  x  z
2  0  1  2
4  0  1  2
[0]
0
2
   y  x  z
4  0  1  2
2  0  1  2
[1]
1
1
   y  x  z
6  1  1  2
[2]
2
1
   y  x  z
0  2  1  2

df1 = df.groupby('y').apply(lambda x: x.sample(sizes[x.y.unique()[0]]))
print (df1)
     y  x  z
y           
0 4  0  1  2
  2  0  1  2
1 6  1  1  2
2 0  2  1  2
...