Pandas - фильтрует фрейм данных, используя список кортежей - PullRequest
0 голосов
/ 04 декабря 2018

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

tuplelist=[('A', 5, 10), ('B', 0, 4),('C', 10, 11)]

Как правильно сделать это?

Я пробовал следующее:

def multcolfilter(data_frame, tuplelist):

    def apply_single_cond(df_0,cond):

        df_1=df_0[(df_0[cond[0]]>cond[1]) & (df_0[cond[0]]<cond[2])]
        return df_1

    for x in range(len(tuplelist)-1):    

  df=apply_single_cond(apply_single_cond(data_frame,tuplelist[x-1]),tuplelist[x])
    return df

1 Ответ

0 голосов
/ 04 декабря 2018

Пример dataframe и tuplelist:

df = pd.DataFrame({'A':range(1,10), 'B':range(1,10), 'C':range(1,10)})
tuplelist=[('A', 2, 10), ('B', 0, 4),('C', 3, 5)]

Вместо работы с кортежами создайте из них словарь:

filters = {x[0]:x[1:] for x in tuplelist}
print(filters)
{'A': (5, 10), 'B': (0, 4), 'C': (10, 11)}

Вы можете использовать pd.cutчтобы задать значения столбцов данных в кадре:

rows = np.asarray([~pd.cut(df[i], filters[i], retbins=False, include_lowest=True).isnull() 
                   for i in filters.keys()]).all(axis = 0)

Используйте rows в качестве логического индексатора df:

df[rows]
   A  B  C
2  3  3  3
3  4  4  4
...