这是系列文章,我会按照stackoverflow上pandas相关问题投票数排序进行整理学习。不学习是会变咸鱼的~
原问题:Select rows from a DataFrame based on values in a column in pandas。根据问题描述,希望通过pandas实现类似mysql查找语句的功能:
1 | select * from table where column_name = some_value; |
pandas中获取数据的有以下几种方法:
- 布尔索引
- 位置索引
- 标签索引
- 使用API
假设数据如下:
1 | import pandas as pd |
布尔索引
该方法其实就是找出每一行中符合条件的真值(true value),如找出列A中所有值等于foo
1 | df[df['A'] == 'foo'] # 判断等式是否成立 |
位置索引
使用iloc方法,根据索引的位置来查找数据的。这个例子需要先找出符合条件的行所在位置
1 | mask = df['A'] == 'foo' |
标签索引
如何DataFrame的行列都是有标签的,那么使用loc方法就非常合适了。
1 | df.set_index('A', append=True, drop=False).xs('foo', level=1) # xs方法适用于多重索引DataFrame的数据筛选 |
关于loc和iloc的区别,官网是这么说的:
Access a group of rows and columns by label(s) or a boolean array.
Purely integer-location based indexing for selection by position.
使用API
pd.DataFrame.query
方法在数据量大的时候,效率比常规的方法更高效。
1 | df.query('A=="foo"') |
数据提取不止前面提到的情况,第一个答案就给出了以下几种常见情况:
1、筛选出列值等于标量的行,用==
1 | df.loc[df['column_name'] == some_value] |
2、筛选出列值属于某个范围内的行,用isin
1 | df.loc[df['column_name'].isin(some_values)] # some_values是可迭代对象 |
3、多种条件限制时使用&
,&
的优先级高于>=
或<=
,所以要注意括号的使用
1 | df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)] |
4、筛选出列值不等于某个/些值的行
1 | df.loc[df['column_name'] != 'some_value'] |