Использование pandas.qcut с учетом столбца Python - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий фрейм данных:

enter image description here

И с помощью функции pandas.qcut я пытаюсь создать новый столбец, который сокращает по Animalв 3 раза, например:

enter image description here

Вот мой код:

    import pandas as pd
df=pd.DataFrame({'Name':['Harry','Sally','Mary','John','Francis','Devon','James','Holly','Molly','Nancy','Ben'], 'Score': [43,234,54,34,12,43,54,65,23,12,32],
                 'Animal': ['dog', 'dog', 'cat', 'cat', 'dog', 'horse', 'dog', 'snake', 'dog', 'mouse', 'horse']})
tiles = pd.qcut(df.index, 3, labels=False)
tiles=tiles+1
df['tiles']=tiles
print(df)

Как мне сделать мойФункция qcut учитывает мой столбец «Животное»?

Заранее спасибо.

Ответы [ 2 ]

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

Ключом к успеху является правильная функция, генерирующая Tile значений:

def tbl(x):
    ccl = itertools.cycle([1,2,3])
    lst = [ next(ccl) for _ in range(len(x)) ]
    return pd.Series(lst, x.index)

Это работает почти как cumcount() с одним отличием: вместо последовательных числа (от range) он генерирует циклическую последовательность [1,2,3], используя itertools.cycle.

Тогда все, что вам нужно сделать (после необходимого импорта и создания источника DataFrame):

  • Сортировать значения по Animal.
  • Сгруппируйте по Animal, возьмите любой столбец (например, Name) и примените к ним вышеупомянутая функция.

Таким образом, весь сценарий (без объявления tbl) может быть следующим:

import pandas as pd
import itertools

df = pd.DataFrame( {'Name': ['Harry', 'Sally', 'Mary', 'John', 'Francis',
        'Devon', 'James', 'Holly', 'Molly', 'Nancy', 'Ben'],
    'Score': [43, 234, 54, 34, 12, 43, 54, 65, 23, 12, 32],
    'Animal': ['dog', 'dog', 'cat', 'cat', 'dog', 'horse', 'dog', 'snake',
        'cat', 'mouse', 'mouse']})
df.sort_values(by='Animal', inplace=True)
df['Tile'] = df.groupby('Animal')['Name'].apply(tbl)

Когда вы печатаете df, результат будет:

       Name  Score Animal  Tile
2      Mary     54    cat     1
3      John     34    cat     2
8     Molly     23    cat     3
0     Harry     43    dog     1
1     Sally    234    dog     2
4   Francis     12    dog     3
6     James     54    dog     1
5     Devon     43  horse     1
9     Nancy     12  mouse     1
10      Ben     32  mouse     2
7     Holly     65  snake     1
0 голосов
/ 08 ноября 2018

Я не знаю, подходит ли qcut, но вы можете сделать это, используя groupby('Animal').cumcount и взяв модуль накопленного счета и 3 (% 3):

>>> df
   Animal     Name
0     cat    Harry
1     cat    Sally
2     cat     Mary
3     dog     John
4     dog  Francis
5     dog    Devon
6     dog    James
7   horse    Holly
8   mouse    Molly
9   mouse    Nancy
10  snake      Ben

df['Tile'] = (df.groupby('Animal').cumcount()%3)+1

>>> df
   Animal     Name  Tile
0     cat    Harry     1
1     cat    Sally     2
2     cat     Mary     3
3     dog     John     1
4     dog  Francis     2
5     dog    Devon     3
6     dog    James     1
7   horse    Holly     1
8   mouse    Molly     1
9   mouse    Nancy     2
10  snake      Ben     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...