【问题标题】:How to remove certain array items in one column by using condition array of another columns in pandas如何通过使用熊猫中另一列的条件数组来删除一列中的某些数组项
【发布时间】:2020-06-25 17:47:19
【问题描述】:

我正在尝试通过使用另一列中的条件数组来浏览其中一列中数据数组的大小。例如,我的数据如下 df :

df= pd.DataFrame({'nHit':[4,3,5],'hit_id':[[10,20,30,50],[20,40,50],[30,50,60,70,80]],'hit_val':[[1,2,3,4],[5,6,7],[8,9,10,11,12]]},index=[0,1,2])

我想知道是否有办法根据hit_id数组的条件移动hit_val列中的所有值(例如只保留hit_id = 30或50相同位置的相关值)。 我想得到的输出类似于 df :

df= pd.DataFrame({'nHit':[2,1,2],'hit_id':[[30,50],[50],[30,50]],'hit_val':[[3,4],[7],[8,9,10]]},index=[0,1,2])

我的想法是通过使用 df.apply() 从 hit_id 列创建一个条件数组,然后用它来过滤 hit_val,有人知道如何实现吗?

【问题讨论】:

    标签: pandas numpy filter apply


    【解决方案1】:

    据我了解,从原始 df 开始,您可以 explode 同时 cols 和过滤条件,然后 groupbyagg 作为 list

    l = [30,50]
    m = pd.concat([df[i].explode() for i in ['hit_id','hit_val']],axis=1)
    out = m[m['hit_id'].isin(l)].groupby(level=0).agg(list)
    out.insert(0,'nHit',out['hit_id'].str.len())
    print(out)
    

       nHit    hit_id hit_val
    0     2  [30, 50]  [3, 4]
    1     1      [50]     [7]
    2     2  [30, 50]  [8, 9]
    

    【讨论】:

    • 非常感谢,anky_91。你的方法解决了我的问题。
    • @ZhenYan Gald 我可以帮忙:)
    • @ZhenYan 我会请求您将当前数据框、工作代码和问题陈述作为新问题添加,因为这个问题已经得到解答。 :) 目前我不在,但其他人可以看到您的问题和答案。
    • 按照你的方法,我在尝试写出数据框时遇到了另一个问题。我将数据框保存到 csv 文件中,然后我从另一个脚本中读取数据框以制作一些图。然后我保存到每一列的列表被读出为单个字符串对象。因此,在我执行额外步骤再次拆分字符串之前,我无法将它们炸开。我的问题是如何在保存之前定义输出格式? agg() 函数可以取 NumPy 数组类型吗?
    • 为了将 python 对象保存在文件中,您可以使用 df.to_pickle 和 read_pickle 函数 :) csv 可以将列表保存为列表
    【解决方案2】:

    使用两个表达式的复制粘贴(谢谢),这是它们的显示(这应该有助于我们可视化所需的操作:

    In [247]: df                                                                                   
    Out[247]: 
       nHit                hit_id             hit_val
    0     4      [10, 20, 30, 50]        [1, 2, 3, 4]
    1     3          [20, 40, 50]           [5, 6, 7]
    2     5  [30, 50, 60, 70, 80]  [8, 9, 10, 11, 12]
    
    In [249]: df1                                                                                  
    Out[249]: 
       nHit    hit_id     hit_val
    0     2  [30, 50]      [3, 4]
    1     1      [50]         [7]
    2     2  [30, 50]  [8, 9, 10]
    

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2022-11-10
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多