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