具有列表理解的Pandas DataFrame条件选择

时间:2020-09-16 19:57:07

标签: python pandas numpy

我有一个包含15列的数据框,分别命名为0、1、2,...,14。我想写一个方法来接收这些数据,以及一个长度为15的向量。我希望它返回基于我已经通过的向量有条件选择的数据帧。例如。传递的数据为data_,向量为v_ 我想产生那个:

data[(data[0] == v_[0]) & (data[1] == v_[1]) & ... & (data[14] == v_[14])]

但是我希望该方法具有灵活性,例如我可以传入100个名为0,...,99的列和一个长度为99的向量的数据框。我的问题是我不知道如何以编程方式巧妙地创建[(data[0] == v_[0]) & (data[1] == v_[1]) & ... & (data[14] == v_[14])]以解决“&”符号。同样,如果有人给我一种方法,可以将“和”或“或”上用True和False填充的多个NxM矩阵合并为单个MxN矩阵,我将感到满意。

非常感谢您!

2 个答案:

答案 0 :(得分: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`比数据框中的列长,这将引发错误。

答案 1 :(得分:0)

这可能有效:

data[(data==v_.transpose())].dropna(axis=1)
相关问题