过滤单元格中有数组的熊猫数据框
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
形式,你可以使用stack
和agg
:
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
【讨论】:
以上是关于过滤单元格中有数组的熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章