Условный выбор фрейма данных Pandas с пониманием списка

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

У меня есть фрейм данных с 15 столбцами с именами 0,1,2,…, 14. Я хотел бы написать метод, который принимал бы эти данные и вектор длиной 15. Я хотел бы, чтобы он возвращал фрейм данных, условно выбранный на основе этого переданного мной вектора. Например. переданные данные — data_, а переданный вектор — v_. Я хотел бы создать это:

 data[(data[0] == v_[0]) amp; (data[1] == v_[1]) amp; ... amp; (data[14] == v_[14])]
  

Однако я хотел бы, чтобы метод был гибким, например, я мог бы передать фрейм данных из 100 столбцов с именами 0, …, 99 и вектор длиной 99. Моя проблема в том, что я не знаю, как умно создать [(data[0] == v_[0]) amp; (data[1] == v_[1]) amp; ... amp; (data[14] == v_[14])] программно для учета знака «amp;». В равной степени я был бы удовлетворен, если бы кто-нибудь дал мне метод, который мог бы объединить несколько матриц NxM, заполненных True и False в «и» или «или» в единую матрицу MxN.

Большое вам спасибо!

Комментарии:

1. если v_ представляет собой массив того же размера, что и количество столбцов, вы можете попробовать data[(data==v_).all(axis=1)]

Ответ №1:

Вы можете попробовать это:

 def custom_filter(data, v):
    if len(data.columns) == len(v):
        # If data has the same number of columns
        #  as v has elements
        mask = (data == v).all(axis=1)
    else:
        # If they have a different length, we'll need to subset
        #  the data first, then create our mask
        #  This attempts to susbet the dataframe by assuming columns
        #    0 .. len(v) - 1 exist as columns, and will throw an error
        #    otherwise
        colnames = list(range(len(v)))
        mask = (data[colnames] == v).all(axis=1)
    
    return data.loc[mask, :]
  
 df = pd.DataFrame({
    "F": list("hiadsfin"),
    0: list("aaaabbbb"),
    1: list("cccdddee"),
    2: list("ffgghhij")
})
v = ["a", "c", "f"]

df
   F  0  1  2  H
0  h  a  c  f  1
1  i  a  c  f  2
2  a  a  c  g  3
3  d  a  d  g  4
4  s  b  d  h  5
5  f  b  d  h  6
6  i  b  e  i  7
7  n  b  e  j  8
  
 custom_filter(df, v)
   F  0  1  2  H
0  h  a  c  f  1
1  i  a  c  f  2
  

Обратите внимание, что с помощью этой функции, если количество столбцов точно соответствует длине вашего вектора v , вам не нужно проверять, помечены ли столбцы как 0, 1, 2, ..., len(v)-1 . Однако, если у вас больше столбцов, чем элементов v, вам необходимо убедиться, что подмножество этих столбцов, помеченных как 0, 1, 2, ..., len(v)-1. If v`, длиннее, чем столбцы в вашем фрейме данных, это выдаст ошибку.

Ответ №2:

Это может сработать:

 data[(data==v_.transpose())].dropna(axis=1)