Кратчайший способ разделения столбца DataFrame от pandas на основе другого столбца - PullRequest
0 голосов
/ 16 октября 2018

Вдохновение

В 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)

, но не из-за необходимости нескольких векторов выборки.

1 Ответ

0 голосов
/ 16 октября 2018

Следуя шаблону 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"]])

Но лично я нахожу это менее читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...