这 20 个Pandas 函数, 你可能没试过
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这 20 个Pandas 函数, 你可能没试过相关的知识,希望对你有一定的参考价值。
参考技术APandas 是 pytho 里主流的数据分析库。Pandas 之所以如此普遍,是因为集功能性、灵活性于一体。为了简化数据分析过程, Pandas 其实内置了许多功能和方法.
本文举例说明 20 个 Pandas 好用的功能和方法。希望这些方法对精进中的你有帮助.
df.query(expr,inplace = False,** kwargs) # 使用布尔表达式查询帧的列
参数:
expr :str要评估的查询字符串, 不同条件之间用布尔运算符连接, 整体外包引号
inplace=False :是否修改数据或返回副本
kwargs :dict关键字参数
返回:DataFrame
根据条件筛选数据是数据分析过程中的常见操作, Pandas 也提供了很多过滤方法, 比如 条件[ ], 比如loc/iloc. 相比之下, query() 做为查询函数, 语句更贴近自然语言, 多条件筛选更加易读
DataFrame.insert( loc , column , value , allow_duplicates=False ) [官方文档]
参数:
loc : 插入列位置, 索引从 0 开始
column : 插入的列的列名
value : 插入的列的 values
allow_duplicates=False : 是否允许存在重复列, 默认不允许
当我们想要在 DataFrame 中添加一个新列时,默认情况下它会被添加到数据帧的末尾。其实Pandas 提供了可以在任何位置插入新列的函数 inser()
如上面参数描述, 前三个参数是必需的: 插入列的位置, 插入列的列名, 插入列的值, value 应该是个 Series 或者类似 array 的对象
DataFrame 包含 A, B, C 3 个不同组。我们可能只对年值感兴趣,但在某些情况下,我们还需要一个累积值。Pandas 提供了一个易于使用的函数来计算累计和,即 cumsum()
sample 方法用于从 Series 或 DataFrame 中随机抽样。当我们想要从分布中选择一个随机样本时,这个函数非常有用
“Where”用于根据条件替换行或列中的值。默认替换值为NaN,但我们也可以指定作为替换的值。
“where”的工作方式是选择符合条件的值,并用指定值替换其余值。其中(df[\'new_col\']<0,0)选择“new_col”中小于0的所有值,其余值替换为0。因此,where也可以被视为\'遮罩运算\'。
where 在 numpy 中语法略有不同, numpy 中还需要指定符合条件时替换的值, 如下两个语句有几乎一样的结果:
区别是 a 是一个 Series, b 是一个一维数组, pandas 的 where 可以通过指定 inplace=True 来改写原 DataFrame
在处理 DataFrame 时,isin 是我们经常使用的筛选方法。但 Isin 还有一种高级用法: 根据给定列表筛选值。
注意给定的列表里的数据类型要和过滤列里的数据类型一致
loc 和 iloc 用来选择行列.
loc用于按标签选择数据。列的标签是列名。行参数的提供方式有两种:
注意 loc 的行参数包含上边界, 而 iloc 里的这种写法不包含上边界
此函数用于计算系列值的百分比变化。考虑我们有一个包含 [2,3,6] 的 Series。如果我们将pct_change 应用于此 Series,则返回的系列将为 [NaN,0.5,1.0]。从第一个元素到第二个元素增加了 50%,从第二个元素到第三个元素增加了 100%。pct_change函数用于比较元素时间序列中的变化百分比。
rank 函数为值排序。假设我们有一个包含[1,7,5,3]的序列。分配给这些值的排序值为[1,4,3,2]
Melt 用于将 二维表 变为 一维表 , 即逆透视. 样例表如下:
可以用透视表还原
explode \'爆裂\'函数(hivesql 里也有)), 等同于拆分+按列展开. 样例表如下:
Nunique统计列或行上的唯一条目数。它在分类特征中非常有用,尤其是在我们事先不知道类别数量的情况下。
我们可以直接将 nunique 函数作用于整个表以查看每列中唯一值的数量:
可用于根据其他行、列对上的值查找表中的值。这个函数最好通过一个例子来解释。假设我们有以下表:
这种方法可以用于用于从另一个表中目标表中匹配列, 类似于:
Pandas 支持多种数据类型,其中一种是 object。对象包含文本或混合(数字和非数字)值。但是,如果有其他选项可用,则不建议使用对象数据类型。使用更具体的数据类型可以更快地执行某些操作。例如,对于数值,我们更喜欢使用整数或浮点数据类型。
infer_objects 尝试为对象列推断更好的数据类型。
尝试对象数据类型列的软转换,使非对象列和不可转换列保持不变。推理规则与正常序列/数据帧构造期间的推理规则相同。。示例表:
可以看到所有列都是 object, 我们尝试一下 infer_objects:
memory_usage 返回每列使用的内存量(字节)。在处理大型数据表时, 有时会需要查看内存用量。考虑下面的100万行数据文件
(1000000, 2)
11.4442138671875
describe 函数计算数字列的基本统计信息,包括计数、平均值、标准偏差、最小值和最大值、中位数、第一个和第三个四分位数。因此,它提供了整个表的统计摘要
Merge()根据两表中的公共列组合成新表。例表如下:
Select_dtypes 函数根据数据类型设置的条件返回数据表列的子集。它有两个参数:include和exlude, 前者意为包含的数据类型, 后者为排除的数据类型
替换数据表中的值
Applymap函数用于将函数应用于数据帧元素。
请注意,如果操作的矢量化版本可用,则应优先于applymap。例如,如果我们想将每个元素乘以一个数字,我们不需要也不应该使用applymap函数。在这种情况下,简单的矢量化操作(例如df*4)要快得多。
但是,在某些情况下,我们可能无法选择矢量化操作。例如,我们可以使用dataframes的style属性更改dataframe的样式。以下函数将负值的颜色更改为红色。
从函数执行存储过程
我知道这已被要求死亡,我知道为什么SQL Server不允许你这样做。
但除了使用扩展存储过程之外,还有其他解决方法吗?
请不要告诉我将我的功能转换为程序...
所以我真正要问的是:有没有办法从函数中运行存储过程?
编辑:
有点证明:有一种解决方法,但它是如此错误,我不会这样做。我要将其更改为存储过程并在其他地方执行。
编辑:我没试过这个,所以我不能保证!你已经知道你不应该这样做,所以请不要这样做。但...
试试这里:http://sqlblog.com/blogs/denis_gobo/archive/2008/05/08/6703.aspx
关键位是我试图为您的目的调整的位:
DECLARE @SQL varchar(500)
SELECT @SQL = 'osql -S' +@@servername +' -E -q "exec dbName..sprocName "'
EXEC master..xp_cmdshell @SQL
不允许函数产生副作用,例如改变表格内容。
存储过程是。
如果一个函数称为存储过程,该函数将变得能够产生副作用。
所以,抱歉,但不,你不能从函数调用存储过程。
除了使用OPENQUERY和xp_cmdshell之外,另一个选项是使用SQLCLR(SQL Server的“CLR集成”功能)。 SQLCLR选项不仅比其他两种方法更安全,而且还有一个潜在的好处是能够在当前会话中调用存储过程,以便它可以访问任何基于会话的对象或设置,例如:
- 临时表
- 临时存储过程
- CONTEXT_INFO
这可以通过使用“context connection = true;”来实现。作为ConnectionString。请记住,将强制执行对T-SQL用户定义函数的所有其他限制(即不能产生任何副作用)。
如果您使用常规连接(即不使用上下文连接),那么它将作为独立调用运行,就像使用OPENQUERY和xp_cmdshell方法时一样。
但是,请记住,如果您将在一个影响多于一行的语句中使用调用存储过程的函数(无论您使用哪三种方法),那么该行为不能指望运行一次每排。正如@MartinSmith在对@MatBailie的回答的评论中提到的那样,查询优化器不保证函数执行的时间或次数。但是如果你在SET @Variable = function();
语句或SELECT * FROM function();
查询中使用它,那么它应该没问题。
下面的文章(我写的)中显示了使用.NET / C#SQLCLR用户定义函数执行存储过程的示例:
Stairway to SQLCLR Level 2: Sample Stored Procedure and Function
这是另一种可能的解决方法:
if exists (select * from master..sysservers where srvname = 'loopback')
exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback', @srvproduct = N'', @provider = N'SQLOLEDB', @datasrc = @@servername
go
create function testit()
returns int
as
begin
declare @res int;
select @res=count(*) from openquery(loopback, 'exec sp_who');
return @res
end
go
select dbo.testit()
它不像xp_cmdshell
那么可怕,但也有too many implications实用。
我找到了解决这个问题的方法。我们可以在存储过程中使用“呈现的”sql构建一个Function或View,然后可以正常执行。
1.创造另一个sproc
CREATE PROCEDURE [dbo].[usp_FunctionBuilder]
DECLARE @outerSql VARCHAR(MAX)
DECLARE @innerSql VARCHAR(MAX)
2.在你的函数中构建你想要执行的动态sql(例如:你可以使用循环和联合,你可以在另一个sproc中读取,使用if语句和参数用于条件sql等)
SET @innerSql = 'your sql'
3.将@innerSql包含在create function语句中,并定义在@innerSql中使用的所有外部参数,以便将它们传递给生成的函数。
SET @outerSql = 'CREATE FUNCTION [dbo].[fn_GeneratedFunction] ( @Param varchar(10))
RETURNS TABLE
AS
RETURN
' + @innerSql;
EXEC(@outerSql)
这只是伪代码,但该解决方案解决了许多问题,例如链接服务器限制,参数,函数中的动态sql,动态服务器/数据库/表名,循环等。
您需要根据需要调整它(例如:更改函数中的返回值)
以上是关于这 20 个Pandas 函数, 你可能没试过的主要内容,如果未能解决你的问题,请参考以下文章