zac*_*ach 603 python dataframe pandas
假设我有以下pandas数据帧:
df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df
A B
0 5 1
1 6 2
2 3 3
3 4 5
Run Code Online (Sandbox Code Playgroud)
我可以根据特定值进行子集化:
x = df[df['A'] == 3]
x
A B
2 3 3
Run Code Online (Sandbox Code Playgroud)
但是我如何根据值列表进行子集化? - 这样的事情:
list_of_values = [3,6]
y = df[df['A'] in list_of_values]
Run Code Online (Sandbox Code Playgroud)
Wou*_*ire 968
这确实是如何通过"within"/"in"过滤pandas的数据帧行的重复?,将响应翻译成你的例子给出:
In [1]: df = pd.DataFrame({'A': [5,6,3,4], 'B': [1,2,3,5]})
In [2]: df
Out[2]:
A B
0 5 1
1 6 2
2 3 3
3 4 5
In [3]: df[df['A'].isin([3, 6])]
Out[3]:
A B
1 6 2
2 3 3
Run Code Online (Sandbox Code Playgroud)
cot*_*ail 24
list_of_values不一定是list; 它可以是set、tuple、dictionary、 numpy 数组、pandas 系列、生成器range等,并且isin()和query()仍然可以工作。
关于query():
isin()在内部调用query():
list_of_values = [3, 6]
df.query("A.isin(@list_of_values)")
Run Code Online (Sandbox Code Playgroud)
local_dict,如果您不想在函数调用链中预先创建过滤列表,则这很有用:
df.query("A == @lst", local_dict={'lst': [3, 6]})
Run Code Online (Sandbox Code Playgroud)
list_of_values是一个范围如果需要在某个范围内进行过滤,可以使用between()方法 或query()。
list_of_values = [3, 4, 5, 6] # a range of values
df[df['A'].between(3, 6)] # or
df.query('3<=A<=6')
Run Code Online (Sandbox Code Playgroud)
df按顺序返回list_of_values在 OP 中, 中的值list_of_values不会按 中的顺序出现df。如果您想df按它们出现的顺序返回list_of_values,即“排序” list_of_values,请使用loc。
list_of_values = [3, 6]
df.set_index('A').loc[list_of_values].reset_index()
Run Code Online (Sandbox Code Playgroud)
如果你想保留旧的索引,可以使用以下内容。
list_of_values = [3, 6, 3]
df.reset_index().set_index('A').loc[list_of_values].reset_index().set_index('index').rename_axis(None)
Run Code Online (Sandbox Code Playgroud)
apply一般来说,isin()和query()是完成此任务的最佳方法;没有必要apply()。例如,对于f(A) = 2*A - 5列 上的函数A, 和isin()的query()工作效率都要高得多:
df[(2*df['A']-5).isin(list_of_values)] # or
df[df['A'].mul(2).sub(5).isin(list_of_values)] # or
df.query("A.mul(2).sub(5) in @list_of_values")
Run Code Online (Sandbox Code Playgroud)
list_of_values要选择不在 中的行list_of_values,请对isin()/取反in:
df[~df['A'].isin(list_of_values)]
df.query("A not in @list_of_values") # df.query("A != @list_of_values")
Run Code Online (Sandbox Code Playgroud)
list_of_values如果您想使用两个(或多个)列进行过滤,可以any()根据需要all()减少列 ( )。axis=1
A或之一的行:
Blist_of_valuesdf[df[['A','B']].isin(list_of_values).any(1)]
df.query("A in @list_of_values or B in @list_of_values")
Run Code Online (Sandbox Code Playgroud)
A选择和都B位于的行list_of_values:
df[df[['A','B']].isin(list_of_values).all(1)]
df.query("A in @list_of_values and B in @list_of_values")
Run Code Online (Sandbox Code Playgroud)
Myk*_*tko 16
您可以使用方法查询:
df.query('A in [6, 3]')
# df.query('A == [6, 3]')
Run Code Online (Sandbox Code Playgroud)
或者
lst = [6, 3]
df.query('A in @lst')
# df.query('A == @lst')
Run Code Online (Sandbox Code Playgroud)
Ach*_*age 10
另一种方法;
df.loc[df.apply(lambda x: x.A in [3,6], axis=1)]
Run Code Online (Sandbox Code Playgroud)
与isin方法不同,这在确定列表是否包含列的函数时特别有用A。例如,f(A) = 2*A - 5作为函数;
df.loc[df.apply(lambda x: 2*x.A-5 in [3,6], axis=1)]
Run Code Online (Sandbox Code Playgroud)
需要注意的是,这种方法比isin方法慢。
| 归档时间: |
|
| 查看次数: |
557372 次 |
| 最近记录: |