过滤pandas数据帧,其中包含单元格中的数组

问题描述 投票:2回答:3

我有一个带有'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的行,例如。

python arrays pandas dataframe loc
3个回答
1
投票

不要在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

1
投票

你可以通过首先使用list comprehension创建一个布尔索引来做到这一点:

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]

0
投票
def check(list):
    return '10' in list

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

输出:

    A   B
2   13  [10, 69]
5   16  [10, 76]
© www.soinside.com 2019 - 2024. All rights reserved.