【问题标题】:Filter pandas dataframe that has arrays in cells过滤单元格中有数组的熊猫数据框
【发布时间】:2019-02-13 10:21:34
【问题描述】:

我有一个带有 'htgt' 列的 Pandas 数据框,该列由内部带有数字的数组组成。数组的大小不是恒定的。数据示例:

11                  [16, 69]
12                  [61, 79]
13                  [10, 69]
14                      [81]
15          [12, 30, 45, 68]
16                  [10, 76]
17                   [9, 39]
18              [67, 69, 77]

例如,我如何过滤所有编号为 10 的行。

【问题讨论】:

  • 表示数组中存在数字 10。我想要所有具有特定数字的行数组。
  • 你能改变你的例子吗...?数字 10 没有出现在任何数组中

标签: python arrays pandas dataframe


【解决方案1】:
def check(list):
    return '10' in list

df[df['B'].astype(list).apply(check)]

输出:

    A   B
2   13  [10, 69]
5   16  [10, 76]

【讨论】:

    【解决方案2】:

    您可以通过首先使用列表推导创建一个布尔索引来做到这一点:

    mask = [(10 in x) for x in df['htgt']]
    df[mask]
    

    如果您愿意,也可以一行:

    df.loc[[(10 in x) for x in df['htgt']]]
    

    [输出]

    htgt
    13  [10, 69]
    16  [10, 76]
    

    【讨论】:

      【解决方案3】:

      不要将类型 list 存储在 pandas 列中,这样效率不高,而且会使您的数据更难交互。只需将您的列表扩展到列:

      out = pd.DataFrame(df.htgt.values.tolist())
      
          0     1     2     3
      0  16  69.0   NaN   NaN
      1  61  79.0   NaN   NaN
      2  10  69.0   NaN   NaN
      3  81   NaN   NaN   NaN
      4  12  30.0  45.0  68.0
      5  10  76.0   NaN   NaN
      6   9  39.0   NaN   NaN
      7  67  69.0  77.0   NaN
      

      现在您可以使用高效的pandas 操作来查找带有10 的行:

      out.loc[out.eq(10).any(1)]
      

          0     1   2   3
      2  10  69.0 NaN NaN
      5  10  76.0 NaN NaN
      

      如果你坚持结果是list形式,你可以使用stackagg

      out.loc[out.eq(10).any(1)].stack().groupby(level=0).agg(list)
      

      2    [10.0, 69.0]
      5    [10.0, 76.0]
      dtype: object
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        • 2019-09-16
        相关资源
        最近更新 更多