近期使用pandas比较频繁,在进行数据处理的时候经常要用到dataframe的数据筛选功能,这里做个小结。
数据有以下的格式:
columns = [“blockNumber”,”timestamp”,”transactionHash”,”from”,”to”,”creates”,……”isError”]
数据筛选基本格式
初级筛选:
==, !=, >, >=,
主要用于简单的判断
选取”from”列数据,最后一位为0或a的数据。(数据类型默认str)
data[data['from'].str[-1:].str.contains('0|a')]
contains语句中,可以以’|’符号为分割,添加多个候选项。
这里由于要只选最后一位,需要使用两次 str 方法。
已有一个取值数组,目标是选择数据中,”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)]
</code></pre>
<p>仔细注意,这里是在前面加个反引号
,通过反引号来表示取反
选取的是数据中,"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中的值,出现的次数,我们很容易想到可以通过value_counts() 方法直接获取:
pd.DataFrame(data['from'].value_counts())
这里value_counts()得到的是一个 pandas.Series
那么更进一步,如果想知道"from"中的每个取值,对应的"to"取值跟"weight"取值分别是多少,可以使用:
pd.DataFrame(data.groupby('from'))
如果要统计的是 from 中的值,每个值对应的 weight
总和是多少,这时候需要使用到 groupby
跟 agg
pd.DataFrame(data.groupby('from').agg('sum'))
假设现在的需求是,将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
Original: https://blog.csdn.net/m0_37990055/article/details/115517841
Author: OnlyCaptain
Title: DataFrame 数据筛选
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/674280/
转载文章受原作者版权保护。转载请注明原作者出处!