在熊猫中使用查询与元组列

时间:2018-08-04 22:06:36

标签: python python-3.x pandas

我有一个pandas df,其中一个列作为元组。我想使用query使用元组的第一个条目对df进行子集化。最好的方法是什么?我在熊猫.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()))

2 个答案:

答案 0 :(得分:1)

我认为您的查询比“ val> 3”更为复杂。这是一种使用public ItemListOwnedFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.word_list, container, false); Log.d("ItemListOwnedFragment", "XD " + "here i want server name" ); } } 访问器从列中获取第一项的简单方法:

.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

使用列表推导从头开始构建新的单列DataFrame。这应该是最快的,但是我更喜欢上面的一种方法。

答案 1 :(得分:1)

  

最好的方法是什么?

我认为,一开始不要使用一系列元组。这否定了Pandas的主要优势之一:使用NumPy数组进行矢量化计算。

相反,您可以将元组系列分成两个整数系列。然后照常使用pd.DataFrame.query

df = pd.DataFrame(df['val'].values.tolist()).add_prefix('val')

print(df.query('val0 > 3'))

   val0  val1
4     4     4
5     5     3
6     6     2
7     7     1
8     8     0