【问题标题】:Filter pandas DataFrame through list of dicts通过字典列表过滤 pandas DataFrame
【发布时间】:2015-12-22 06:16:55
【问题描述】:

我有任意长度的 DataFrame,有 X 列(比如说 10):

>>> names = ['var_' + str(x) for x in range(1, 11)]
>>> names
['var_1', 'var_2', 'var_3', 'var_4', 'var_5', 'var_6', 'var_7', 'var_8', 'var_9', 'var_10']
>>> df = pd.DataFrame(np.random.randint(100, size=(10,10)), columns = names)
>>> df
   var_1  var_2  var_3  var_4  var_5  var_6  var_7  var_8  var_9  var_10
0     39     49      6     39     16     41      8     86     23      52
1      6     16     21     20     81     97     83     25     56      73
2     72     97     43     50     10     46     22     75      7      18
3     20     35     69     59     14     24     57     31     47      20
4     39     93     45     80     74     87     83     50     52      67
5     93     75     83     67     40     46     79     11     31      95
6     75     76     57     82     69     98     74     75     93      13
7     35     19     28     67     39     23     72     16     63      67
8     93     87     52     25     63     29     46     64     78      12
9     81     43      4     90     88     64      1     83     26      22

现在我想使用字典列表逐行过滤这个 DataFrame:

>>> test_dict_1 = {'var_1': 89, 'var_2': 12, 'var_3': 34}
>>> test_dict_2 = {'var_7': 3, 'var_2': 11, 'var_4': 19, 'var_1': 9}
>>> test_dict_3 = {'var_3': 31}
>>> filter = [test_dict_1, test_dict_2, test_dict_3]

要得到一些结果(dict?DataFrame?很少 DataFrames?),它只包含那些至少通过了一个过滤器的行(即所有变量在行中的值与过滤器中的值相同)。除此之外,我当然需要知道哪些过滤器通过了。

我对 pandas 很陌生,所以如果我能在没有“for”循环的情况下做到这一点,我会有点困惑。请问有什么解决办法吗?

我知道像 df[(df.A == 1) & (df.D == 6)] 这样的链式解决方案,但是有没有可能有几个不同的过滤器? 最终目标是通过过滤器标记每一行,而不是循环。

【问题讨论】:

    标签: python pandas indexing filter


    【解决方案1】:

    我不确定我是否正确,但如果您想通过字典中的几个条件过滤数据框,您可以执行以下操作:

    In [107]: df
    Out[107]: 
       var_1  var_2  var_3  var_4  var_5  var_6  var_7  var_8  var_9  var_10
    0     45     36     84     24     86     26     44      6     44      15
    1     72     16     67     75     87     89      8     68     32      49
    2      9     49      0      4     77     75     65      9     45      70
    
    test_dict_1 = {'var_1': 72, 'var_2': 16, 'var_3': 67}
    
    cond = True
    for var in test_dict_1.keys():
        cond = cond & (df[var] == test_dict_1[var])
        df = df.loc[cond]
    

    然后你会得到:

    In [109]: df
    Out[109]: 
       var_1  var_2  var_3  var_4  var_5  var_6  var_7  var_8  var_9  var_10
    1     72     16     67     75     87     89      8     68     32      49
    

    【讨论】:

    • 那是一个字典,是的,我在我的问题中提到了这个解决方案。我正在谈论使用字典列表进行过滤,即几乎没有类似的字典。我想我必须使用循环。
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2021-02-15
    相关资源
    最近更新 更多