python - 在熊猫中使用带有元组列的查询
问题描述
我有一个 pandas df,其中一个列作为元组。我想使用query
元组的第一个条目来对 df 进行子集化。最好的方法是什么?我在 pandas .23.3,Python 3.6.6
MWE:
import pandas as pd
df = pd.DataFrame({"val": list(zip(range(9), range(9)[::-1]))})
df.query("val[0] > 3") #this line does not work!
我知道我可以先拆分列然后再拆分子集,但我不想拆分它。
更新:对于决定解包元组并拥有两个单独列的任何人,这是一种简单的方法:
df["a"], df["b"] = list(zip(*df.val.tolist()))
解决方案
我假设您的查询比“val > 3”更复杂。这是使用访问器从列中获取第一项的简单方法.str
:
df.val.str[0].to_frame().query('val > 3')
val
4 4
5 5
6 6
7 7
8 8
这样做的原因是因为.str
它将适用于任何对象列(这包括列表和元组的列),而不仅仅是字符串(字符串被认为是对象,是许多可能的类型之一)。
如果query
不是必需品,这将足够好:
v = df.val.str[0]
v[v > 3]
val
4 4
5 5
6 6
7 7
8 8
还有
pd.DataFrame({'val' : [v[0] for v in df['val']}).query('val > 3')
val
4 4
5 5
6 6
7 7
8 8
它使用列表推导从头开始构建一个新的单列 DataFrame。这应该是最快的,但我更喜欢上述方法之一。
推荐阅读
- r - 与决策树中的误分类率相关的查询
- java - 如何使用 Jackson 将地图转换为 POJO
- database - 我们如何从 h2 数据库中提取 blob 数据类型列的数据?
- python - 如何在sklearn的随机森林中获得决策函数
- mysql - 查询以从子表中获取不同的数据
- php - 包括刀片(导航刀片)未按预期工作,导航栏覆盖产量内容
- matlab - 使用 lsqcurvefit 将微分方程系统故障拟合到数据
- python - Celery Task 需要每 N 次运行一次但需要先完成
- python - Dash 应用程序在本地运行,因为它在服务器中引发错误
- c++ - Arduino:如何向任何文本框或记事本显示 Serial.print 值