数分笔记整理13 - 数据处理综合运用 - 数据过滤 & 数据转换

数据过滤

可以使用布尔数组或者索引数组的方式来过滤数据。
另外,也可以用DataFrame类的query方法来进行数据过滤。在query方法中也可以使用外面定义的变量,需要在变量前加上@。

# 数据过滤第一种方式:通过布尔数组进行过滤。
# new_data = data[data[3] >= 200]
# 第二种方式:通过query方法进行过滤。该方法指定过滤条件,类似于数据库查询指定的where条件。
# query方法,使用的列名必须是合法的标示符。
# 错误。
# data.query("3 >=200 and 3 <= 300")
data.columns = ["date", "url", "content", "value1", "value2"]
# data.query("value1 >= 200 and value1 <= 300")
# min_ = 200
# max_ = 250
# 如果在query方法中,需要使用外部定义的变量值,只需要在变量名前加上@符号。
# data.query("value1 >= @min_ and value1 <= @max_")

def query_data(min_, max_):
    return data.query("value1 >= @min_ and value1 <= @max_")

query_data(100, 220)

数据转换

应用与映射

Series与DataFrame对象可以进行行(列)或元素级别的映射转换操作。对于Series,可以调用apply或map方法。对于DataFrame,可以调用apply或applymap方法。

  • apply:通过函数实现映射转换。【Series传递元素,DataFrame传递行或列。】
  • map:对当前Series的值进行映射转换。参数可以是一个Series,一个字典或者是一个函数。
  • applymap:通过函数实现元素级的映射转换。

替换

Series或DataFrame可以通过replace方法可以实现元素值的替换操作。

  • to_replace:被替换值,支持单一值,列表,字典,正则表达式。
  • regex:是否使用正则表达式,默认为False。
def f(item):
#     display(item)
    return item ** 2

def f2(item):
#     return int(item.replace("厘米", ""))
    return item.replace("厘米", "")

# data["value1"] += 10
# Series的apply方法,可以用于数据转换。
# apply方法的参数为函数类型。参数(函数A)的要求:A需要具有一个参数,用来接收Series中的每一个元素。同时,函数A需要具有返回值,
# 该返回值用来替换Series中的每一个元素。
# 当Series调用apply方法时,Series中的每一个元素都会调用A一次,将元素本身作为参数传入给A(作为A的参数传入),使用函数A的返回值
# 替换当前的元素。
# s = pd.Series([1, 3, 5, 7, 9])
# s.apply(f)
s = pd.Series(["181厘米", "190厘米", "175厘米"])
# s = s.apply(f2)
# s.astype(np.int64)
# 转换函数如果功能非常简单,也没有必要单独定义一个函数,可以直接使用匿名函数。
# s.apply(lambda item: item.replace("厘米", ""))

# Series的map方法,map的参数也可以是一个函数类型,此时,map的功能与apply是相同的。
# 除此之外,map方法的参数还支持字典类型或者Series类型。
# 字典类型:字典的key用来指定元素映射之前的值,字典的value用来指定元素映射之后的值。。
# Series: Series的index用来指定元素映射之前的值,Series的value用来指定元素映射之后的值。

# s.map(lambda item: item.replace("厘米", ""))
# s.map({"181厘米": 181, "190厘米": 190, "175厘米": 175})
# s.map(pd.Series([181, 190, 175], index=["181厘米", "190厘米", "175厘米"]))
#  通过apply来实现head的功能。
def f(item):
#     display(item)
    return item.iloc[0:2]

# 通过apply来动态增加一列
def f2(item):
    item["new"] = np.random.random()
    return item

# DataFrame的apply方法。
# DataFrame的apply方法类似于Series的apply方法。该方法也是接收一个函数对象作为参数(参数类型为函数类型)。
# 不同的是,Series的apply是在元素级上进行的操作,而DataFrame的apply是在行(列)级上进行的操作。
# DataFrame apply方法的函数A要求:A需要具有一个参数,同时,具有返回值。A函数的参数用来接受DataFrame的一列(行),A函数
# 的返回值用来替换参数传递的行(列)。
# 在apply方法调用时,DataFrame的每一列(行)都会调用函数A一次,将当前列(行)作为参数传递给函数A,然后使用函数A的返回值
# 替换掉当前列(行)。
# apply方法中,传递的到底是行还是列,取决于axis参数。axis=0(默认),传递一列,axis=1,传递一行。

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
display(df)
# df.apply(f, axis=0)
# df.apply(f2, axis=1)

def f3(item):
    display(item)
    return item

# 与apply相似,只是元素级别上进行的应用。applymap也是接收一个函数,流程与apply相似。
# df.applymap(lambda item: item + 100)
df.applymap(f3)
# 对DataFrame整体上执行的替换。(会逐个检查每个元素,如果匹配,则完成替换。)
# 替换单一的元素。
# data.replace("2015-4-28", "2016-4-28")
# 替换多个元素(将不同的元素替换为相同的元素)。
# data.replace(["2015-4-28", "2015-8-24"], "2016-1-1")
# 替换多个元素(将不同的元素替换为不同的元素)。替换规则:对位进行替换。
# data.replace(["2015-4-28", "2015-8-24"], ["2016-4-28", "2016-8-24"])
# 可以传递一个字典,来实现更加直观的替换。key指定要替换的值,value指定替换之后的值。
# data.replace({"2015-4-28": "2016-4-28", "2015-8-24": "2016-8-24"})

# 注意:DataFrame的replace函数与str的replace的不同:
# str的replace可以实现部分的替换。
# DataFrame的replace实现的是全文匹配,不能进行部分替换。
# data.replace("2015", "2016")
# 为了能够实现部分匹配,我们可以使用正则表达式来完成。
# 如果需要进行正则表达式的匹配,需要将regex参数设置为True。
data.replace("[0-9]{4}", "abcd", regex=True)

字符串矢量化计算

Series类型具有str属性(StringMethods类型),可以支持字符串的矢量化计算。StringMethods类中提供的方法基本与Python中str类型的方法名称相同,功能也对应相同。

说明:

  • 字符串矢量化计算要求Series的数据是字符串类型。
# 矢量(向量)化计算=》使用整个矢量(向量)来参与计算。而不是循环使用每个分量来参与计算。
li = [1, 2, 3]
# 不是矢量化计算。
li2 = [i + 1 for i in li]
a = np.array([1, 2, 3])
# 矢量化计算。
a + 1

# 此种方式是字符串的标量化计算。(因此其针对的是每个元素实现的循环操作)
s = pd.Series(["181厘米89", "190厘米123", "175厘米222"])
# s.apply(lambda item: item.replace("厘米", ""))

# Series中,提供一个str的属性(StringMethods类型),通过该属性,可以实现字符串的矢量化计算。
# StringMethods类型提供了很多矢量化字符串操作的方法。这些方法与str提供的方法很类似。
# s.str.replace("厘米", "")
# 能够进行正则提取元素内容。
# s.str.extract("([0-9]+)厘米([0-9]+)")

# 注意:Series的str属性,只有当Series的元素是str类型时,才能够使用。
s = pd.Series([1, 2, 3])
# 错误
# s.str
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值