Фильтровать столбцы Dataframe на основе списка - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть список с номерами, и я хочу найти все различные комбинации этих чисел без повторения.Оттуда следующим шагом будет фильтрация столбцов кадра данных df по номерам столбцов;номера столбцов являются ранее найденными комбинациями.Затем я должен выполнить некоторые вычисления для нового отфильтрованного кадра данных на каждой итерации.

Предположим, у меня есть следующий код:

import pandas as pd 
import numpy as np
import itertools

lst = [1, 2, 3] #intial list
    for i in range(1,4) #combs can have 1, 2 or 3 numbers  
        combs = [] #empty list to store combinations
        els = [list(x) for x in itertools.combinations(lst, i)]
        for j in range(0,len(els)): #loop through each combination found
                temp_list=els[j]
                temp_df=df.iloc[:temp_list]

                #...Do some calculations with temp_df#

При выполнении этого кода я получаю следующую ошибку: не могусделать индексирование срезов с помощью этих индексаторов [[1]] класса 'list'

Я думаю, els в моем коде также является списком списка (и temp_list).Поэтому я попытался сгладить их, чтобы получить список (эта тема была рассмотрена здесь, например: Создание плоского списка из списка списков в Python )

Однако при запуске этой строки

flat_list = [item for sublist in temp_list for item in sublist]

Я получаю новую ошибку: объект 'int' не повторяется.Как я могу получить список чисел, которые я могу использовать для фильтрации моего кадра данных?Спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Использование примера кадра данных:

df = pd.DataFrame([[0, 1, 2], [3, 4, 5], [6, 7, 8]], columns=[1, 2, 3])

Предоставление:

   1  2  3
0  0  1  2
1  3  4  5
2  6  7  8

Следующий код должен достичь того, что вы хотите.Обратите внимание, что я использую .loc здесь, а не .iloc, поскольку я указываю столбец имена , а не индексы .Если вы хотите указать индексы, используйте .iloc.

import itertools

#Initial list
lst = [1, 2, 3]

#Assemble all combinations
combs = [list(x) for i in range(1,4) for x in itertools.combinations(lst, i)]

#Use .loc
for comb in combs: #For each combination
    temp_df = df.loc[:,comb]
    print(temp_df)

Выход:

   1
0  0
1  3
2  6 

   2
0  1
1  4
2  7 

   3
0  2
1  5
2  8 

   1  2
0  0  1
1  3  4
2  6  7 

   1  3
0  0  2
1  3  5
2  6  8 

   2  3
0  1  2
1  4  5
2  7  8 

   1  2  3
0  0  1  2
1  3  4  5
2  6  7  8 
...