Возврат списка после использования функции фильтра панд - PullRequest
0 голосов
/ 28 августа 2018

Я новичок в Пандах, и у меня возникли некоторые действительно сложные проблемы.

Я хотел бы сгруппировать выборки по значению в соответствующих столбцах, а затем выполнить вызовы API, основываясь на этом значении столбца.

Эта часть сделана. После того, как объект создан, я хотел бы вернуть объекты и сохранить их в локальной переменной, что является сложной задачей.

Вот мой набор данных в файле .CSV.

    Sample  Sample Type Tumor   Age Location
       1       Blood    Benign  43   LUNG
       2       FFPE     Benign  23   LUNG
       3       Blood    Benign  12  LUNG

Я фильтрую тип образца крови или FFPE, а затем применяю функцию для создания образцов

def create_samples(x):

    sample_objects = Sample.create({
        'count': x.shape[0],
        'type': x.iloc[0]['Sample Type']
    })

    return sample_objects

if __name__ == '__main__':

    df = pd.read_csv(path)
    blood_samples, ffpe_samples = df.groupby('Sample Type').filter(lambda x: create_samples(x))

Он выполняет итерации по функциям дважды, потому что есть два SampleTypes, я полагаю, что сначала он создает образцы крови, а затем - образцы FFPE.

В обоих случаях объект создается, и я хочу вернуть эти объекты в переменные blood_samples и variable_samples соответственно. Возможно ли это сделать?

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

мысли?

1 Ответ

0 голосов
/ 28 августа 2018

Вы используете groupby.filter неправильно. В контексте groupby, filter принимает функцию, которая возвращает логическое значение. Результатом является объединенный фрейм данных, который состоит только из групп, в которых функция вернула True

Что вы хотите, это

blood_samples, ffpe_samples = (create_samples(d) for _, d in df.groupby('Sample Type'))

И это работает, только когда в df.Sample

есть ровно два уникальных значения

Может быть, лучше оставить его в качестве словаря

sample_dict = {n: create_samples(d) for n, d in df.groubpy('Sample')}
...