【DataFrame.eval的介绍】包括np.allclose(), np.random.RandomState()

eval() 主要用于在表达式上下文中执行 Python 表达式。它允许用户创建复杂的计算表达式,其中可以包括变量引用、函数调用以及其他算术运算等。

具有灵活性高、易于理解、兼容性强等优点

一、数据生成

import pandas as pd
import numpy as np

rng = np.random.RandomState(2)
df = pd.DataFrame(rng.rand(1000, 3), columns=['A', 'B', 'C'])
df.head()

在这里插入图片描述
这里有必要提一下RandomState

先看看截取的一部分官方说法:

class RandomState(builtins.object)
| RandomState(seed=None)
|
| RandomState and Generator expose a number of methods for generating random numbers drawn from a variety of probability distributions. In addition to the distribution-specific arguments, each method takes a keyword argument size that defaults to None.
|
| If size is None, then a single value is generated and returned.
|
| If size is an integer, then a 1-D array filled with generated values is returned.
|
| If size is a tuple, then an array with that shape is filled and returned.

提纲挈领一下,
就是RandomState有一个关键字参数size默认为None
如果sizeNone,则生成并返回一个值;
如果size是一个整数,则返回一个填充生成值的一维数组;
如果size是元组,然后填充并返回一个具有该形状的数组

我们可以把传入的数字看做是随机数生成器的id(唯一!)

之后无论我们重复运行这个.py文件多少次,哪怕你把电脑重启了,只要再一次运行这个.py文件,他都始终产生同一个随机数

二、DataFrame.eval()借助列名称运算

先来看一下pd.eval()

result1 = ((df['A'] + df['B']) / df['C'])
result2 = pd.eval('(df.A + df.B) / df.C')
np.allclose(result1, result2)

这里也提一嘴allclose
它是用来比较数组的相似度的,如果两个数组的元素在一个“可容忍”的范围内相等,则返回True

allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
Returns True if two arrays are element-wise equal within a tolerance.
Examples
--------
np.allclose([1e10,1e-7], [1.00001e10,1e-8])
False
np.allclose([1e10,1e-8], [1.00001e10,1e-9])
True
np.allclose([1e10,1e-8], [1.0001e10,1e-9])
False
np.allclose([1.0, np.nan], [1.0, np.nan])
False
np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
True

而DataFrame.eval()可以通过列名称实现更简洁的代数式

result3 = df.eval('(A + B) / C')
np.allclose(result1, result3)

三、DataFrame.eval()新增列

通过A,B,C列的一个运算生成新增的D列:

df.eval('D = (A + B) / C', inplace=True)
df.head()

在这里插入图片描述
还可以修改已有的列:

df.eval('D = (A - B) / C', inplace=True)
df.head()

在这里插入图片描述

四、DataFrame.eval()使用局部变量

vari_name = df.mean(1)
res1 = df['A'] + vari_name
res2 = df.eval('A + @vari_name')
np.allclose(res1, res2)

注意:@表示这是一个变量名称,而不是一个列名称

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值