2017-01-17 4 views
2

Предположим, что у меня установлен набор диафрагмы. Есть ли способ лаконично выполнить описанные ниже операции в пандах?python pandas сортировать по группе и применять функцию

  1. Группа по мишени
  2. Внутри каждой группы, расположить данные в порядке убывания «чашелистиков длиной (см)»
  3. Внутри каждой группы, назначить от 1 до 5 лучших строк и от 0 до остальных?

Для тех, зная R, я просто хочу, чтобы воспроизвести следующий код (да, это было временное решение есть):

iris %>% 
    group_by(Species) %>% 
    arrange(desc(Sepal.Length)) %>% 
    mutate(size_tag = 1, 
     size_tag = cumsum(size_tag), 
     size_tag = ifelse(size_tag <= 5, 1, 0)) 

До сих пор у меня есть:

from sklearn import datasets 
iris = datasets.load_iris() 
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']], 
       columns= iris['feature_names'] + ['target']) 

def fn(group, col_nm): 
    group[col_nm] = 1 
    group[col_nm] = np.cumsum(group[col_nm]) 
    group[col_nm] = np.where(group[col_nm] <= 5, 1, 0) 
return group 

iris['size_tag'] = np.NaN 
iris.groupby('target').apply(pd.DataFrame.sort_values, 'sepal length (cm)').apply(fn, args = (['size_tag'])) 

Результат Я получаю дополнительную строку, добавленную к DataFrame ...

Я только начинаю использовать pandas и Python, поэтому любые замечания (например, связанные с кодированием) являются welc Ома.

+0

rpl, вы знаете о пакете пера? вы можете захватить data.frame и [перо пакет] (https://blog.rstudio.org/2016/03/29/feather/), это инструмент для улучшения взаимодействия между Python, R, он преобразует ваши данные .frame в формат, который можно обменять с R на Python и наоборот. –

+0

Да, я знаю. Тем не менее, я счел странным экспортировать радужную оболочку из R и импортировать ее на Python, используя перо, особенно, что он доступен в sklearn. Наверное, я бы получил комментарий «Знаете ли вы, что диафрагма доступна в sklearn?» :-). Это будет иметь смысл, хотя, если я столкнусь с стеной в Питоне ... в крайнем случае. Но я твердо верю, что панды достаточно сильны :-). Поскольку это немного не работает, есть модуль ggplot для Python. – rpl

ответ

2

Это получает ряд единиц и нулей

iris.sort_values(
    'sepal length (cm)', ascending=False 
).groupby('target').cumcount().__floordiv__(5).eq(0).astype(np.uint8) 

Более читаемый

s = iris.sort_values('sepal length (cm)', ascending=False) 
c = s.groupby('target').cumcount() 
((c // 5) == 0).astype(np.uint8) 

Производят копию с новой колонки

s = iris.sort_values('sepal length (cm)', ascending=False) 
c = s.groupby('target').cumcount() 
top5 = ((c // 5) == 0).astype(np.uint8) 
iris.assign(size_tag=top5) 

enter image description here

+0

Вау! Неудивительно, что я не мог понять это! Правильно ли, что нужно просто сортировать перед группировкой? Вы знаете, почему код, который я написал, был неправильным? Я хотел бы понять мою ошибку (и я понятия не имею, почему она так поступила). – rpl

+0

Это один из способов сделать это. Сортировка, позволила мне узнать, что первые пять являются верхними. – piRSquared

1

я воспроизвел свой R dataframe, и я думаю, что это делает то же самое:

iris = iris.sort_values(['target', 'sepal length (cm)'], ascending=False) 
iris['size_tag'] = iris.index.isin(iris.groupby('target').head(5).index)*1 

Мы первый сортируем значение от вида, а затем чашелистиков длиной в пределах каждой группы видов. Затем мы добавляем метки в верхнюю часть 5 для каждой группы.

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

  • Нет связанных вопросов^_^