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 的行。
您可以通过首先使用列表理解创建一个布尔索引来做到这一点:
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)
不要将类型存储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
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)
| 归档时间: |
|
| 查看次数: |
2524 次 |
| 最近记录: |