Кратчайший способ разделения столбца DataFrame от pandas на основе другого столбца

1

вдохновение

В R это очень просто

data("iris")
bartlett.test(Sepal.Length ~ Species,data = iris)

Важное значение в наборе данных состоит в том, что столбец Sepal.Length является числовым, вид является категоричным.

проблема

В Python scipy.stats.bartlett потребуются отдельные массивы для каждого вида, см. Документы.

Каким будет самый простой способ достичь этого?

Простой способ получить набор данных в python:

from sklearn import datasets
iris = datasets.load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                     columns= ["sepal.length","sepal.width","petal.length","petal.width"] + ['species'])

Я действительно хотел, чтобы это работало:

iris.groupby("species")["sepal.length"].apply(ss.bartlett)

но это не связано с тем, что ему нужно несколько векторов образцов.

  • 0
    где декларация для сс?
  • 1
    @Yuca import scipy.stats as ss
Показать ещё 3 комментария
Теги:
pandas

1 ответ

4
Лучший ответ

После шаблона groupby вы можете немного манипулировать и сделать это:

gb = iris.groupby('species')["sepal.length"]
ss.bartlett(*[gb.get_group(x).values for x in gb.groups])

* распаковывает список в функцию, остальное - это просто, чтобы группы были в правильной форме для функции. Как уже упоминалось в комментариях, здесь .values здесь не нужны, поэтому мы можем написать это как:

gb = iris.groupby('species')["sepal.length"]
ss.bartlett(*[gb.get_group(x) for x in gb.groups])

И только для завершения, если вы действительно хотите сделать это в одной строке:

ss.bartlett(*[x[1] for x in iris.groupby('species')["sepal.length"]])

Но я лично считаю это менее читаемым.

  • 0
    Кажется, что .values не нужен, поэтому это решение еще круче, чем казалось! Мне немного грустно, что для этого нужны две строки, но на самом деле с такими данными, где есть только один категорический столбец, я полагаю, вы в groupby случае сразу сделаете groupby , поэтому я думаю, что все в порядке :) (Я учу курс статистики, используя R и параллельно я выясняю все на python, так как обычно это язык, который я использую, и теперь, когда я нашел некоторые изящные возможности pandas я снова думаю, что, вероятно, python лучше в целом: D) ,
  • 0
    о да, так это работает: ss.bartlett(*(gb.get_group(g) for g in gb.groups))
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню