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

Posted

技术标签:

【中文标题】过滤单元格中有数组的熊猫数据框【英文标题】: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 没有出现在任何数组中 【参考方案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

【讨论】:

以上是关于过滤单元格中有数组的熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫数据框单元格中的字典解析为新行单元格(新列)

读取包含来自csv的单元格中的字典的熊猫数据框

根据“如果单元格中的字符串”条件删除熊猫列中的行

从熊猫数据框单元格中的凌乱字符串中删除换行符?

如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

列表追加到熊猫单元格中