首页 > 解决方案 > 在熊猫中使用带有元组列的查询

问题描述

我有一个 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()))

标签: pythonpython-3.xpandas

解决方案


我假设您的查询比“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。这应该是最快的,但我更喜欢上述方法之一。


推荐阅读