pandaslambda函数 pandassum函数
2025-01-05 10:17 - 立有生活网
pandas 修改科学计数法显示
两个对象的行列索引可以是不同顺序的,结果的索引会自动按顺序排列。pandas中dateframe中在使用pandas读取文件的时候,我们可以直接改变数据类型,使用参数是converters:float类型数据默认以科学计数法显示,很难看,
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月···