pandas DataFrame 数据筛选
- DataFrame 数据筛选
- 数据筛选基本格式
- contains
- isin
- 多个条件与或
- 数据筛选进阶
- groupby
- agg
- np.where
DataFrame 数据筛选
近期使用pandas比较频繁,在进行数据处理的时候经常要用到dataframe的数据筛选功能,这里做个小结。
数据有以下的格式:
columns = [“blockNumber”,“timestamp”,“transactionHash”,“from”,“to”,“creates”,……“isError”]
数据筛选基本格式
初级筛选:
==, !=, >, >=, <, <=
主要用于简单的判断
contains
选取"from"列数据,最后一位为0或a的数据。(数据类型默认str)
data[data['from'].str[-1:].str.contains('0|a')]
contains语句中,可以以’|'符号为分割,添加多个候选项。
这里由于要只选最后一位,需要使用两次 str 方法。
isin
已有一个取值数组,目标是选择数据中,"from"数据的值在取值数组内的数据
targetList = ['0x12','0x1a','0x98', ... , '0x82']
data[data['from'].isin(targetList)]
这里targetList
最好保持list
的数据类型,使用pandas.Series
可能会有意外的错误
反过来,如果目标是选择数据中,"from"数据的值不在取值数组内的数据
targetList = ['0x12','0x1a','0x98', ... , '0x82']
data[`data['from'].isin(targetList)]
仔细注意,这里是在前面加个反引号 ` ,通过反引号来表示取反
多个条件与或
选取的是数据中,"from"列数据的取值在目标数组内,或者"to"列数据取值最后一位为0或a的数据
targetList = ['0x12','0x1a','0x98', ... , '0x82']
data[(data['from'].isin(targetList)) | (data['to'].str[-1:].str.contains('0|a'))]
选取的是数据中,"from"列数据的取值在目标数组内,并且"to"列数据最后一位为0或a的数据
targetList = ['0x12','0x1a','0x98', ... , '0x82']
data[(data['from'].isin(targetList)) & (data['to'].str[-1:].str.contains('0|a'))]
如果是多个条件并列在一起,每个条件都需要用括号括起来。
数据筛选进阶
这里主要介绍一些,跟数据库操作相似的数据筛选,假设数据格式如下:
columns = ['from', 'to', 'weight'] # from,to 都是 str数据,weight是 int 数据
groupby
这里,假设一个需求是,统计from中的值,出现的次数,我们很容易想到可以通过value_counts() 方法直接获取:
pd.DataFrame(data['from'].value_counts())
这里value_counts()得到的是一个pandas.Series
那么更进一步,如果想知道"from"中的每个取值,对应的"to"取值跟"weight"取值分别是多少,可以使用:
pd.DataFrame(data.groupby('from'))
agg
如果要统计的是 from 中的值,每个值对应的weight
总和是多少,这时候需要使用到groupby
跟agg
pd.DataFrame(data.groupby('from').agg('sum'))
np.where
假设现在的需求是,将from跟to的数据,每一行按照 from > to 的顺序交换(注意不是整列交换)。这时可以使用np.where
实现。
data['from'], data['to']= np.where(
data['from'] > data['to'],
[data['to'], data['from']],
[data['from'], data['to']])
np.where
使用格式是:
np.where(condition, Yes, No)
condition
为True
时,取值为Yes
,为False
时,取值是No