过滤在单元格中有数组的熊猫数据框

Bor*_*lis 4 python arrays loc dataframe pandas

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

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]
Run Code Online (Sandbox Code Playgroud)

例如,如何过滤所有数字为 10 的行。

Chr*_*s A 5

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

mask = [(10 in x) for x in df['htgt']]
df[mask]
Run Code Online (Sandbox Code Playgroud)

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

df.loc[[(10 in x) for x in df['htgt']]]
Run Code Online (Sandbox Code Playgroud)

[输出]

htgt
13  [10, 69]
16  [10, 76]
Run Code Online (Sandbox Code Playgroud)


use*_*203 3

不要将类型存储listpandas列中,这样效率不高,而且会使数据更难以交互。只需将列表扩展到列即可:

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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用有效的pandas操作来查找具有以下内容的行10

out.loc[out.eq(10).any(1)]
Run Code Online (Sandbox Code Playgroud)

    0     1   2   3
2  10  69.0 NaN NaN
5  10  76.0 NaN NaN
Run Code Online (Sandbox Code Playgroud)

如果您坚持以形式显示结果list,您可以使用stackand agg

out.loc[out.eq(10).any(1)].stack().groupby(level=0).agg(list)
Run Code Online (Sandbox Code Playgroud)

2    [10.0, 69.0]
5    [10.0, 76.0]
dtype: object
Run Code Online (Sandbox Code Playgroud)