【问题标题】:pandas df explode and implode to remove specific dict from the listpandas df explode 和 implode 从列表中删除特定的字典
【发布时间】:2023-02-01 14:44:12
【问题描述】:

我有包含多列的熊猫数据框。在名为request_headers 的列中,格式为字典列表,例如:

[{"name": "name1", "value": "value1"}, {"name": "name2", "value": "value2"}]

我只想从该列表中删除那些确实包含特定名称的元素。例如:

blacklist = "name2"

我应该得到相同的数据框,所有列都包括request_headers,但它的值(基于上面的例子)应该是:

[{"name": "name1", "value": "value1"}]

如何实现?我试过先爆炸,然后过滤,但无法正确地“内爆”。

谢谢,

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    爆炸是昂贵的,而不是我们的列表理解:

    blacklist = "name2"
    
    df['request_headers'] = [[d for d in l if 'name' in d and d['name'] != blacklist]
                             for l in df['request_headers']]
    

    输出:

                              request_headers
    0  [{'name': 'name1', 'value': 'value1'}]
    

    【讨论】:

      【解决方案2】:

      可以使用 .apply 函数:

      blacklist = 'name2'
      df['request_headers'] = df['request_headers'].apply(lambda x: [d for d in x if blacklist not in d.values()])
      

      【讨论】:

      • 它比列表理解慢并且可能不正确,即使黑名单的值不同于名称,这也会过滤字典(或者我误解了这个问题?)
      【解决方案3】:
      df1=pd.DataFrame([{"name": "name1", "value": "value1"}, {"name": "name2", "value": "value2"}])
      blacklist = "name2"
      col1=df1.name.eq(blacklist)
      df1.loc[col1]
      

      出去:

          name   value
      1  name2  value2
      

      【讨论】:

        猜你喜欢
        • 2022-11-26
        • 2021-12-05
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 2016-05-10
        • 2016-02-14
        • 1970-01-01
        • 2020-07-14
        相关资源
        最近更新 更多