我有一个带有'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的行,例如。
不要在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
你可以通过首先使用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]
def check(list):
return '10' in list
df[df['B'].astype(list).apply(check)]
输出:
A B
2 13 [10, 69]
5 16 [10, 76]