pandaslambda函数 pandassum函数

2025-01-05 10:17 - 立有生活网

pandas 修改科学计数法显示

两个对象的行列索引可以是不同顺序的,结果的索引会自动按顺序排列。

pandas中dateframe中在使用pandas读取文件的时候,我们可以直接改变数据类型,使用参数是converters:float类型数据默认以科学计数法显示,很难看,

pandaslambda函数 pandassum函数pandaslambda函数 pandassum函数


pandaslambda函数 pandassum函数


可以在pd.set_option设置display.float_format参数来以政策小数显示,比如下面设置显示到小数点后3位

pd.set_option('display.float_format', lambda x: '%.3f' % x)

set_option中还有其它一些控制设置,包括默认显示列数,行数等等

pd.set_option('display.max_columns',5, 'display.max_rows', 100)

pandas爆炸函数使用

前段时间部门有位大数据开发的同事离职了,在他和其他开发的同事进行工作项目交接的时候,我去旁听了下,因为涉及到一些公司业务逻辑的问题。当讲到某个项目的时候,他谈到:

当时他举了一个简单的例子来说明爆炸函数的功能,我当场就记下了这个函数名称: 爆炸函数 。Hive在我的工作中使用的并不多,于是我在想: Pandas能够实现这个功能吗 ?

爆炸函数到底实现的是什么需求呢?我回忆一下当时的例子:

现在有一份数据,包含订单编号和订单中商品价格(价格每个订单3个商品),使用hive中的爆炸函数之后变成如下如所示的样子:相当于是实现了 列转成行 的功能。这样后续就能进行各种聚合作。

Hive中实现爆炸功能有两个函数,可自行搜索了解:

碰巧最近有一个需求就用到爆炸函数的功能,不过是用pandas实现的。在下面表格的左边部分是每个订单的销售记录,包含销售员、跟单员、结单员, 他们三者不一定是同一个人 。

现在需要统计每个员工的销售业绩。 销售业绩也就是指员工参与了多少订单 。统计每个员工的销售业绩:

爆炸函数到底实现的是什么功能呢?右边就是我们想要的结果:

1In [17]:、在pandaIn [12]:s模拟了一份数据如下:

3、实施爆炸功能,使用的是pandas中的 explode 函数,得到新数据:可以看到每个订单号会多次出现

4、统计结果

这样根据不同的字段,比如 员工、销售员、跟单员 等就能统计不同的业绩

pandas中文叫做熊猫,它是Python的核心数据处理和数据分析的第三方库,它拥有快速、灵活、明确的数据结构。

Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(另一个Python库,提供高性能的矩阵运算),能够用于数据挖掘和数据分析,同时也提供数据清洗功能。

pandas的具体使用以后会形成连载系列,敬请期待!

本文结语: 拥抱pandas,告别Excel !

Pandas基本作

DataFrame在进行算术运算时会进行补齐,在不重叠的部分补足NA:

一、查看数据

1.查看DataFrame前xx行或后xx行

a=DataFrame(data);

a.head(6)表示显示前6行数据,若head()中不带参数则会显示全部数据。

a.tail(6)表示显示后6行数据,若tail()中不带参数则也会显示全部数据。

2.查看DataFrame的index,columns以,dtypes及values

a.index ; a.columns ; a.values;a.dtypes 即可

3.describe()函数对于数据的快速统计汇总

a.describe()对每一列数据进行统计,包括计数,均值,std,各个分位数等。

4.对数据的转置

a.T

5.对轴进行排序

a.sort_index(axis=1,ascending=False);

其中axis=1表示对 所有的columns 进行排序,下面的数也跟着发生移动。后面的ascending=False表示按降序排列,参数缺失时默认升序。

6.对DataFrame中的值排序

a.sort(columns='x')

即对a中的x这一列,从小到大进行排序。注意仅仅是x这一列,而上面的按轴进行排序时会对所有的columns进行作。

二、选择对象

1.选择特定列和行的数据

a['x'] 那么将会返回columns为x的列, 注意这种方式一次只能返回一个列。 a.x与a['x']意思一样。

取行数据,通过切片[]来选择

如:a[0:3] 则会返回前三行的数据。

2.通过标签来选择

a.loc['one']则会默认表示选取行为'one'的行;

a.loc[:,['a','b'] ] 表示选取所有的行以及columns为a,b的列;

a.loc[['one','two'],['a','b']] 表示选取'one'和'two'这两行以及columns为a,b的列;

a.loc['one',''a]与a.loc[['one'],['a']]作用是一样的,不过前者只显示对应的值,而后者会显示对应的行和列标签。

这与通过标签选择类似

a.iloc[1:2,1:2] 则会显示行列的数据;(切片后面的值取不到)

a.iloc[1:2] 即后面表示列的值没有时,默认选取 行位置为1的数据 ;

a.iloc[[0,2],[1,2]] 即可以自由选取行位置,和列位置对应的数据。

4.使用条件来选择

使用 单独的列 来选择数据

a[a.c>0] 表示选择c列中大于0的数据

使用where来选择数据

a[a>0] 表直接选择a中所有大于0的数据

使用isin()选出 特定列中包含特定值的行

a1=a.copy()

a1[a1['one'].isin(['2','3'])] 表显示满足条件:列one中的值包含'2','3'的所有行。

三、设置值(赋值)

赋值作在上述选择作的基础上直接赋值即可。

例a.loc[:,['a','c']]=9 即将a和c列的所有行中的值设置为9

a.iloc[:,[1,3]]=9 也表示将a和c列的所有行中的值设置为9

同时也依然可以用条件来直接赋值

a[a>0]=-a 表示将a中所有大于0的数转化为负值

四、缺失值处理

在pandas中,使用np.nan来代替缺失值,这些值将默认不会包含在计算中。

1.reindex()方法

用来 对指定轴上的索引进行改变/增加/删除作 ,这将返回原始数据的一个拷贝。

a.reindex(index=list(a.index)+['five'],columns=list(b.columns)+['d'])

a.reindex(index=['one','five'],columns=list(b.columns)+['d'])

即用index=[]表示对index进行作,columns表对列进行作。

a.fillna(value=x)

表示用值为x的数来对缺失值进行填充

3.去掉包含缺失值的行

a.dropna(how='any')

表示去掉所有包含缺失值的行

五、合并

1.contact

contact(a1,axis=0/1,keys=['xx','xx','xx',...]),其中a1表示要进行进行连接的列表数据,axis=1时表横着对数据进行连接。axis=0或不指定时,表将数据竖着进行连接。a1中要连接的数据有几个则对应几个keys, 设置keys是为了在数据连接以后区分每一个原始a1中的数据。

例:a1=[b['a'],b['c']]

result= pd.concat (a1,axis=1,keys=['1','2'])

2.Append 将一行或多行数据连接到一个DataFrame上

a.append(a[2:],ignore_index=True)

表示将a中的第三行以后的数据全部添加到a中,若不指定ignore_index参数,则会把添加的数据的index保留下来,若ignore_index=Ture则会 对所有的行重新自动建立索引。类似于SQL中的join

设a1,a2为两个dataframe,二者中存在相同的键值,两个对象连接的方式有下面几种:

(1)内连接, a2, on='key')

(2)左连接, a2, on='key', how='left')

(3)右连接, a2, on='key', how='right')

六、分组(grouOut[11]:pby)

用pd.date_range函数生成连续指定天数的的日期

pd.date_range('20000101',periods=10)

Pandas计算标准

读取文件生成DataFrame最常用的是read_csv,read_table方法。该方法中几个重要的参数如下所示:

标准(或方),分为总体标准(方)和样本标准(方)。

前者分母为n,后者为n-1。后者是无偏的。

pandas 里的 df.std() 和 df.var() 都是算的无偏的。

而 numpy 是有偏的。

如果需要用 pandas 的 std() 方法计算有偏标准,可以用下面两种方法:

Excel中也有计算有偏标准和无偏标准的函数。

STDEVA 是在前者基础上令文本和逻辑值参与计算。

SOut[13]:TDEVP 是整个样本 总体的标准偏 ;

STDEVPA 也是在前者基础上令文本和逻辑值参与计算。

Pandas介绍

首先,需要先安装numpy和pandas环境,参考:

Pandas 有三种基本数据结构:Series、DataFrame 和 Index。

Pandas 的 Series 对象是一个带索引数据构成的一维数组。Series 对象将一组数据和一组索引绑定在一起,我们可以通过 values 属性和 index 属性获取数据。values 属性返回的结果与 NumPy 数组类似;index 属性返回的结果是一个类型为 pd.Index 的类数组对象。

可以像访问Numpy那样来访问Series(序号也是从0开始计数的)。

Pandas 的 Series 对象比Numpy更加灵活、通用。

Series是 特殊的字典 ,Series 对象其实是一种将类型键映射到一组类型值的数据结构,Pandas Series 的类型信息使得它在某些作上比 Python 的字典更高效。用字典创建 Series 对象时,其索引默认 按照顺序排列 。

DataFrame有2个常用属性,分别是 index 属性 和 columns 属性 。前者可以获取索引标签(行标签);后者是是存放列标签的Index 对象。DataFrame 是特殊的字典,一列映射一个Series 的数据。

DataFrame可以通过以下几种方式来创建:(1)通过单个 Series 对象创建。(2)通过字典列表创建。(3)通过 Series 对象字典创建。(4)通过NumPy 二维数组创建。(5)通过 NumPy 结构化数组创建。

可以将Index视为一个不可变数组或有序。当作为不可变数组时,一般数组的访问方式(例如切片等)对Index适用,与数组的区别是 Index对象不可更改 。当作为时,Index也可以做交集、并集等常规作。

Series的访问既可以作为字典,也可以作为一维数组。数据访问的方法,可以参考Numpy的访问方式,这里不赘述。

如果Series的显式索引是整数,那么在访问时,很容易混淆。例如下边的例子:

从上边的例子总结得出,python的默认规则是:在Pandas中缺失值相关的方法主要有以下三个:单个访问时,使用的显式索引,而在切片时,使用的是隐式索引,很容易混淆!python提供了loc、iloc和ix三种索引器。

loc表示:表示取值和切片都是显式的。iloc 属性,表示取值和切片都是隐式索引。ix是loc和iloc的混合形式,应用于dataFrame(使用例子在3.3节)。

dataframe可以通过对列名进行字典形式(dictionary-style)的取值获取数据。可以把 DataFrame 看成是一个增强版的二维数组,用 values 属性按行查看数组数据。ix 索引器对于整数索引的处理和之前在 Series 对象中介绍的一样,都容易让人混淆。

对于一元运算(像函数与三角函数),这些通用函数将在输出结果中保留索引和列标签(很简单,所有元素做相应运算并返回);而对于二元运算(如加法和乘法),Pandas 在传递通用函数时会自动 对齐索引 进行计算。

当在两个 Series 或 DataFrame 对象上进行二元计算时,Pandas 会在计算过程中对齐两个对象的索引。如果想给缺失数值指定一个默认值,需要使用add来替代+,并指定fill_value:

注意:DataFrame访问行可以使用loc,但是访问列,只能是df['col']这种形式了。

缺失值有三种形式:null、NaN 或 NA。

处理缺失值,一般有两种方法:一种方法是通过一个覆盖全局的掩码表示缺失值,另一种方法是用一个标签值(sdf = pd.DataFrame({entinel value)表示缺失值。

掩码是利用一个跟原来一样大小的矩阵,用0或者1表示某个元素缺失。标签值是利用一个特殊字符例如NaN表示缺失。

Pandas 选择用标签方法表示缺失值,包括两种 Python 原有的缺失值: 浮点数据类型(包括整型) 的 NaN 值,以及 Python的 None 对象 。

使用None时,表示一个空的python对象,所以numpy的dtype=object,因为是对象所以在进行大批量计算时,效率会比标量低。使用np.nan时表示标量,效率会高很多。

对于缺失值,pandas提供了几个有用的API方法,分别是:isnull(),notnull(),dropna(),fillna()。其中,对于dataframe,dropna()方法默认会将包含NaN的整行都drop掉,如果想按照整列drop,增加axis=1参数。

下面例子,使用元组索引生成Series。筛选2019的索引,非常繁琐。

Pandas 的 MultiIndex 类型提供多种实现方法,下边例子使用元组表示实现。

unstack() 方法可以快速将一个多级索引的 Series 转化为普通索引的DataFrame。stack() 方法实现相反的效果。

总结一下,创建多级索引的方法包括:

(1)通过一个有不同等级的若干简单数组组成的列表来构建 MultiIndex:pd.MultiIndex.from_arrays。

(2) 多个索引值的元组构成的列表创建 MultiIndex:pd.MultiIndex.from_tuples。

(3)用两个索引的笛卡尔积创建MultiIndex:pd.MultiIndex.from_product。

(4)直接提供 lls和labels创建 MultiIndex(lablels是指每个级别的整数指定每个位置):

上边的例子中,不管是Series还是DataFrame都是按照行来进行多级索引,其实,也可以按列索引,而且非常简单,下边是一个例子(几个学生在2018和2019两次考试的不同科目成绩):

需要对多级索引做显示切片作时,可以使用pd.IndexSl对象来切,不同级别的维度,拿逗号分割,例如下边例子中的df_sd_003.loc[idx_sd[2018,:],idx_sd['Al',:]]。其他切片和取值作与Numpy很类似。

如果 MultiIndex 不是有序的索引,那么大多数切片作都会失败。

层级数据维度转换的另一种方法是行列标签转换,可以通过reset_index 方法实现

通过pd.concat()实现pandas对象合并,pd.cancat的所有参数(下面列举的是这些参数的默认值):

pd.concat() 可以简单地合并一维的 Series 或 DataFrame 对象,与

np.concatenate() 合并数组一样。

DataFrame 的合并默认都是逐行进行的(axis=0);pd.concat在合并时会保留索引,即使索引是重复的!如果设置 verify_integrity=True,那么生成重复索引时,会触发异常!有时索引无关紧要,那么合并时就可以忽略它们,可以通过设置 ignore_index 参数来实现。默认的合并方式是对所有输入列进行并并(join='outer'),当然也可以用 join='inner' 实现对输入列的交并。下面是一个实现合并的例子: 实现的功能基于关系代数(relational algebra)的一部分。 函数实现了三种数据连接的类型:一对一、多对一和多对多。会自动识别2个dataframe共有的列,并以这个列进行关联。

上边的例子中,关联的两个dataframe具有相同名称的列,pandas会直接按同名列合并,由于两个输入要合并的列通常都不是同名的,因此 提供了一些参数处理这个问题。

1.最简单的方法就是直接将参数 on 设置为一个列名字符串或者一个包含多列名称的列表,这个参数只能在两个 DataFrame 有共同列名的时候才可以使用。

python中,用pandas将字符串数据类型转换成浮点数,语法怎么写?

1、上面的日、月、年现在是数值类型的数据,不能直接相加,先进。以下语句检查并确认安装成功。行转化:

我觉得有可能是因为你前面一次已经转换成功了(并保存为了文件?),第二次已经是float类型,再用replace当然就出错了

解决方法你replace之前需要判断一下列类型,当然写成多个语句来实现,一个lambda里不好实现

pandas 按照之前几列的条件新增一列?

根本原因:这两个字段是字符类型,进行+作,是直接将里面的内容拼接在一起,而不是里面数值的相加。

先说原因:三条语句按顺序运行,肯定以一句结果为准,所以你感觉只有一行生效。

一个建议:取样本测试数据的时候,考虑下取方便显示验证的数据。

解决方案:如果之前tag内容,直接保留tag内容。代码如下变动

my_dict = {'keyword': [False, False, False, True], 'sampling': [False, True, False, False],

'value': [True, False, False, False], 'Tag': ['No Tag', 'No Tag', 'No Tag', 'No Tag']}

result_fin_copy = pd.DataFrame(my_dict)

print(result_fin_copy)

result_fin_copy['Tag'] = result_fin_copy.apply(lambda x: 'No Tag' if x.value != True else 'Score', axis=1)

result_fin_copy['Tag'] = result_fin_copy.apply(lambda x: x.Tag if x.sampling != True else 'Sampled', axis=1)

result_fin_copy['Tag'] = result_fin_copy.apply(lambda x: x.Tag if x.keyword != True else 'Keyword', axis=1)

print(result_fin_copy)

运行结果:

keyword sampling value Tag

0 False False True No Tag

1 False True False No Tag

2 False False False No Tag

3 True False False No Tag

keyword sampling value Tag

0 False False True Score

1 False True False Sampled

2 False False False No Tag

3 True False False Keyword

Procepandas中的T属性或者transe函数就是实现行转列的功能,准确地说就是转置ss finished with exit code 0

后记,这个代码还是有缺陷的,或者说这个样本数据本身的逻辑还有点问题,即,如果一行同时满足两个条件,应该显示哪个Tag。

pandas取后四位值

3.通过位置来选择

我最近必须获得某些项目的设置状态,标记为ID.我找到了这个: Python : How can I get Rows which he the max value of the group to which they belong?

令我惊讶的是,只有~2e6行的数据集相当慢.但是我不需要获得所有值,只需要一个.

import numpy as np

import pandas as pd

"id": np.random.randint(1, 1000, size=5000),

"status": np.random.randint(1, 10, size=5000),

time.strftime("%Y-%m-%d", time.localtime(time.time() - x))

for x in np.random.randint(-5e7, 5e7, size=5000)

],

})

%timeit df.groupby('id').apply(lambda t: t[t.date==t.date.max()])

1 loops, best of 3: 576 ms per loop

%timeit df.reindex(df.sort_values(["date"], ascending=False)["id"].drop_duplicat如果Series或者DataFrame的索引是未排序的,可以简单地通过sort_index方法来快速排序。es().index)

100 loops, best of 3: 4.82 ms per loop

个是我在链接中找到的解决方案,这似乎是一种允许更复杂作的方法.

但是对于我的问题,我可以排序和删除重复项和重新索引,这会更好地执行.特别是在较大的数据集上,这确实有所不同.

我的问题:有没有其他方法可以实现我想做的事情?可能会有更好的表现?

解决此问题的另一种方法是在groupby上使用聚合,然后在完整数据帧上进行选择.

df.iloc[df.groupby('id')['date'].idxmax()]

这似乎比您提出的解决方案快5-10倍(见下文).请注意,这仅在’date’列是数字而不是字符串类型时才有效,并且此转换还可以加快基于排序的解决方案:

# Timing your original solutions:

%timeit df.groupby('id').apply(lambda t: t[t.date==t.date.max()])

# 1 loops, best of 3: 826 ms per loop

%timeit df.reindex(df.sort_values(["date"], ascending=False)["id"].drop_duplicates().index)

# 100 loops, best of 3: 5.1 ms per loop

# convert the date

df['date'] = pd.to_datetime(df['date'])

%timeit df.groupby('id').apply(lambda t: t[t.date==t.date.max()])

# 1 loops, best of 3: 815 ms per loop

%timeit df.reindex(df.sort_values(["date"], ascending=False)["id"].drop_duplicates().index)

# 1000 loops, best of 3: 1.99 ms per loop

# my aggregation solution

%timeit df.iloc[df.groupby('id')['date'].idxmax()]

# 10 loops, best of 3: 135 ms per loop

深入浅出Pandas--数据类型转换

DataFrame类似于RDBMS中的Table。DataFrame就可以看作是一种既有灵活的行索引,又有灵活列名的二维数组。

对应书本第二部分第5章Pandas高级作第2节

在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。之前的章节中介绍过,加载数据时可以指定数据各列的类型:

Pandas可以用以下方法智能地推断各列的数据类型,会返回一个按推断修改后的Dat两者的主要区别是:NumPy 数组通过 隐式定义 的整数索引获取数值,而 Pandas 的 Series 对象用一种 显式定义 的索引与数值关联。也就是说,Numpy的索引是系统自分配的无法更改,但是Series对象是可以手工指定的。aFrame。如果需要使用这些类型的数据,可以赋值替换

pd.to_XXX系统方法可以将数据安全转换,errors参数可以实现无法转换则转换为兜底类型:

转换为数字类型时,默认返回的dtype是float64还是int64取决于提供的数据。使用downcast参数获得向下转换后的其他类型

可以应用在函数中:

astype()是最常见也是最通用的数据类型转换方法,一般我们使用astype()作数据转换就可以了

以下是一些使用示例:

当数据的格式不具备转换为目标类型的条件时,需要先对数据进行

处理。例如"89.3%"是一个字符串,要转换为数字,要先去掉百分号:

我们通常使用pd.to_datetime()和s.astype('datetime64[ns]')来做时间类型转换,第14章会专门介绍这两个函数

Pandas重塑和轴向旋转

至于四者的具体别,具体学习参考sql中相应的语法。

有许多用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。

2、生成一个新字段: 员工

数据重塑和轴向旋转作:表示转换一个表格或向量的结构,使其适合于进一步的分析

层次化索引为DataFrame数据的重排任务提供了一种具有良好一致性的方式。主要功能有二:

Series没有stack属性

In [1]:

In [2]:

Out[2]:

In [3]:

Out[3]:

In [4]:

Out[4]:

列索引,逆时针旋转为行索引

Out[5]:

In [7]:

Out[7]:

In [8]:

Out[8]:

对层次化索引的Series,可以用unstack将其重排为一个DataFrame

In [10]:

Out[10]:

In [11]:

Out[12]:

In [13]:

In [18]:

Out[18]:

In [24]:

Out[24]:

行索引和列索引,交换位置

In [25]:

Out[25]:

In [26]:

Out[26]:

In [27]:

Out[27]:

In [28]:

Out[28]:

In [29]:

Out[29]:

In [30]:

Out[30]:

stack默认会滤除缺失数据,因此该运算是可逆的

In [32]:

Out[32]:

In [33]:

Out[33]:

对DataFrame进行unstack作时,作为旋转轴的级别将会成为结果中的级别

In [34]:

Out[34]:

In [36]:

Out[36]:

In [38]:

Out[38]:

In [41]:

Out[41]:

In [43]:

Out[43]:

In [42]:

Out[42]:

class是什么意思,中文翻译方面的知识

今天小栢来给大家分享一些关于class是什么意思中文翻译方面的知识吧,希望大家会喜欢哦 class是什么意思,中文翻译方面的知识 class是什么意思,中文翻译方面的知识 class是什么意思,中文翻译方···

每年的什么为世界气象日?_每年的哪一天为世

气象日是每年的()。 气象日是每年的3月23日。 每年的什么为世界气象日?_每年的哪一天为世界气象日? 每年的什么为世界气象日?_每年的哪一天为世界气象日? 每年的什么为世界气象日?_每年···

2015年9月3日大阅兵完整版 2015年9月3日大阅兵优

今天小栢来给大家分享一些关于2015年9月3日大阅兵优酷方面的知识吧,希望大家会喜欢哦 2015年9月3日大阅兵完整版 2015年9月3日大阅兵优酷 2015年9月3日大阅兵完整版 2015年9月3日大阅兵优酷 2015年9月···