pandas中concat函数(pandas append concat)

http://www.itjxue.com  2023-01-24 16:02  来源:未知  点击次数: 

pandas中哪个函数不能实现数据的合并

groupby。

Pandas中一共有五个数据合并函数,分别为:concat、append、merge、join、combine。

pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。

pandas表连接

Pandas Dataframe有三种连接方法,分别是merge,join,concat。

merge相当于SQL中的join。通过在两个Dataframe中共有的列或索引进行合并。

通过on参数指定连接的共有列名或索引名,how参数指定连接方式为left、right、outer、inner(默认)。如果不指定on参数,则默认在两个Dataframe的列交集作为连接键。

对于非公有列,采用left_on、right_on分别制定两个Dataframe用于连接的列。

join方法也用来横向连接Dataframe,与merge类似。但主要基于行索引进行合并。

在不指定on参数的时候,默认按照行索引进行简单合并。类似于axis=1时的concat方法。

如果希望使用列进行连接,需要将列设置为行索引在进行连接。有如下两种方式。

concat则用来堆叠连接Dataframe。

参数axis用来指定堆叠方向。默认为0,沿行索引方向(纵向)堆叠,1则沿列方向。

通过join参数,指定用inner、outer方式来处理堆叠方向外的轴方向上索引的处理方式。

此外,常用的参数还包括ignore_index,用来决定是否保留原Dataframe中的索引。

python--pandas合并与连接

append 方法根据行在原数据框添加新的数据框。

如果想要合并后的数据框索引重写排序,可以设置参数 ignore_index=True 。

concat 函数是panda自带的,可以按行或按列合并多个pandas数据框。

按行合并多个数据框,需要注意的是 objs参数接受一个可迭代对象 。concat函数默认按行合并。

设置 ignore_index=True ,使合并后的数据框索引重新排序。

按行合并时,concat对所有的列进行全连接(参数 join='outer' ),没有的列会填充为NaN。

设置参数 join='inner' ,可以只保留共有的列。

设置参数 axis=1 或 axis='columns' ,可以按列合并多个数据框。

merge 方法根据列或索引连接数据框。

当两个数据框只有一个相同列时, merge 方法会自动根据相同列进行内连接, on 参数可以省略。

设置参数 how=['left','right','outer','inner','cross'] ,可以完成不同类型的连接。

当两个数据框没有相同列时,需要设置 left_on 和 right_on 参数,表示按这两列进行连接。

如果需要根据数据框的索引进行连接,需要根据需求设置参数 left_index=True 或者 right_index=True 。

设置 suffixes ,可以给相同的列名添加后缀。默认后缀是 _x , _y 。

join 方法与 merge 方法作用相同,基本上 merge 方法已经可以完成所有的连接操作。

join 方法对按索引连接更方便而已。

当连接的两个数据框中没有相同列时,可以直接按索引进行左连接。

同样,可以设置 how 参数,控制连接的行为。

当数据框中有相同列时,需要设置后缀。

pandas数据合并之append与concat

pandas的数据合并与重塑有很多种方法,包括直接复制列,concat,append,merge和join,本文将重点讨论前面三种最简单而又最常用的方法。merge和join有空再更哈?。

可以将新的数据列利用 [] 直接赋值给原始数据,但是要求新的列名不能和原始数据中的列名重名,否则会覆盖原始数据中的列。

具体来看:

可以看到新的数据块被直接贴在了原数据列的后面,是不是很简单,嗯但是这个方法有很多局限性,比如:

前面已经有了合并列的方法,那么pandas不会这么坑爹,不能合并行吧!!当然不会,append就是干这个事情的,它专门用来在表尾添加新行...

熟悉Python的大佬们看到append这个词就应该有感觉了,没错,它就是添加新元素的方法。Seris,DataFrame,Index都有这个方法,我们可以利用这个添加新元素的方法,来对数据进行纵向合并。

官方文档中是这样描述append的用途的“在表尾中添加新行,并且返回添加后的数据对象,如果添加的行中存在原数据中没有的列,那么将给原数据添加一个新列,并用nan补值。”

DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)

我们来看个栗子:

concat函数是在 pandas 命名空间下的方法,所以通过pd.concat()的方式来引用,它可以将数据根据不同的轴作做融合。concat 与其说是连接,更准确的说是拼接。就是把两个表直接合在一起。于是有一个突出的问题,是横向拼接还是纵向拼接。

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)

常用参数:

obj:要合并的series,dataframe或者是panel构成的序列,常将这些数据排成一个列表[data1,data2....]。

axis:按照哪个方向拼接,0是纵向拼接(默认),1是横向拼接。

join:设置合并取交集(inner)还是并集(outer)。纵向拼接时取column的交并集,横向拼接时取index的交并集。

join_axes:index的列表,仅在横向合并时使用,指明要将数据合并入哪个原表的index。

ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。

keys:表标识的列表,用来区分合并的表来自哪里。

纵向合并axis=0,是将表在竖直方向拼接起来,此时join参数控制的是column的交集或者并集,使用join_axes会报错。举个栗子....

我们看到join参数控制着column的交并集。如果取并集,不存在的位置会被补充上nan。

另外,如果我们设置了ignore_index=True的话,数据合并后将会重新按照0,1,2,3.......的顺序重新构建索引。

横向合并axis=1,是将表在水平方向拼接起来,此时join参数控制的是index的交集或者并集。

横向合并时,即便是列名相同,也不会合并成一列,因为此时join控制的是index的交并集。而ignore_index将会重排列名的索引,而不是重排index。

再来个index并集的栗子.....

如果有join_axes的参数传入,可以指定根据哪个index来对齐数据 。例如根据df1表对齐数据,就会保留指定的df1表的index,然后将df4的表与之拼接,仅axis=1时有效。是不是有种熟悉的感觉,嗯对,和直接复制列一样.....

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

pandas常用函数汇总

pandas官方文档:

对常用函数做了汇总,每个函数的参数可能不是全的,但是常用的,不常用的没总结,如有问题,请不吝赐教,谢谢!

1、创建Series

? ? ? 通用函数:pd.Series(values,index)

? ?? 1)pd.Series([1,2,3],index=[‘a’,‘b’,‘c‘])

? ?? 2)pd.Series(np.array([1,2,3]),index=[‘a’,‘b’,‘c‘])

? ?? 3)pd.Series({ 'a':1,? 'b':2,? 'c':3})

? ? ? ? Series转字典:Series.to_dict()

? ?? 说明:Series的values参数是python中常见的一维数据类型。

2、属性

? ?? 1)Series.values ---array([1,2,3])

? ? ? ? ?? Series的values是array类型

? ?? 2)Series.index---index([‘a’,‘b’,‘c‘])

? ? ? ? ?? 未指定index时,自动生成 0-(N-1)的整数索引,

? ? ? ? ?? 指定 index时,使用指定索引。

?3、Series的索引与切片

? ? ?? Series[0] / Series['a']? : Sereis可以位置索引或标签索引,也可以进行切片操作

1、创建DataFrame

? ? 1) 创建DataFrame的通用函数:

? ?? df = pd.DataFrame(values,index,columns)

? ?? pd.dataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['a','b','c'],columns=['bj','sh','sz'])

? ?? pd.dataFrame(np.arange(1,10).reshape(3,3),index=['a','b','c'],columns=['bj','sh','sz'])

? ?? pd.dataFrame('bj':[1,4,7],'sh':[2,5,8],'sz':[3,6,9],index=['a','b','c'])

说明:创建方法与Sries类似,Series的values参数是python中常见的一维数据类型,DataFrame的values参数是python中常见的二维数据类型。

? ? 2) 通过网页中复制数据快捷创建

? ? ? ? import webbrowser

? ? ? ? link = ''

? ? ? ? webbrowser.open(link)

? ? ? ? 打开界面进行复制,将数据复制到粘贴板中

? ? ? ? df = pd.read_clipboard() ? #从粘贴板中读取数据

? ? 3)通过Series创建DataFrame

? ? ? ? df = pd.DataFrame([s1,s2,s3],columns=['bj','sh','sz'])

? ? ? ? 注意:单独的s1,s2,s3是纵向排列的的Series,但是在DataFrame中是横向排列的。

? ? ? ? 自己总结:Series除了打印出来是Series格式外,其他时候可以直接当作list来操作。

2、属性

? ?? 1)df.columns

? ? ? ? 通过columns生成新的DataFrame

? ? ? ? df_new = pd.DataFrame(df,columns=['x1','x2'])

? ? ? ? 或者df_new = df[['x1','x2']]

? ? 2)df.shape? 显示行列数

? ? 3)df.head() ? 默认显示前5行

? ? 4)df.tail() ? ? 默认显示后5行

3、获取DataFrame的列

? ?? 1)获取DataFrame某一列

? ? ? ? ? df.x1或df['x1']:返回值是Series,可以理解为一个DataFrame是由多个Series组成的。

? ? ? 2) 获取DataFrame某几列

? ? ? ? ? df_new = df[['x1','x2','x3']]

4、为某列赋值

? ? ? 1) df['x1'] = range(10)

? ? ? 2) df['x1'] = numpy.arange(10)

? ? ? 3) df['x1'] = pd.Series(np.arange(10))

? ? ? 说明:类似于创建Series

?5、为某列对应的特定行重新赋值

? ? ? ? df['x1'] = pd.Series([2,3],index=[0,1])

? ? ? ? 将列为x1,行索引为0和1的值改为2,3

?6、获取DadaFrame的行

? ? ? for row in DataFrame.iterrows():

? ? ? ? ? ? ? print(row[0],row[1])

? ? ? #每个row是一个元祖,包含2个元素,row[0]是整型索引,row[1]是Series,所以从行的角度也可以看出,一个DataFrame是由多个Series组成的。

?7、DataFrame的转置

? ? ? df_new = df.T

1、粘贴板的io

? ? ? df = pd.read_clipboard()

? ? ? df.to_clipboard()

?2、csv的io

? ? ?? df.to_csv('xxx.csv')

? ? ?? df = pd.read_csv('xxx.csv')

? 3、json的io

? ? ?? df.to_json()

? ? ?? pd.read_json(df.to_json())

?? 4、excel的io

? ? ? ? df.to_excel('xx.xlsx')

? ? ? ? df = pd.read_excel('xx.xlsx')

?? 5、df = pd.read_sql('')

? ? ? ? df.to_sql('')

?1、iloc

? ? ? sub_df = df.iloc[10:20,:]? 选取DataFrame的10-20行,所有列数据

? ? ? sub_df = df.iloc[10:20,0:2]

? ? ? 说明:iloc函数是位置索引,与索引的名字无关。

?? 2、loc

? ? ? sub_df = df.loc[10:20,:'movie_name']

? ? ? 说明:loc是标签索引,10,20,'movie_name'? 都是索引名字,与位置无关。

1、Series.reindex(index=['x1','x2','x3'],fill_value=10)

? ? ? 将df重新索引,并且将NaN空值用10进行填充

2、Series.reindex(index=range(15),method='ffill')

? ?? 前项填充,后面的值用前面的值进行填充

? ?? 通过reindex想到,如果想新增一个空列或者空行,可以用reindex方法,同样地,想减少某些行或者某些列,也可以用reindex方法。

? ? ? 继reindex之后删除行列的函数操作

? ? ? Series.drop('A') ? #删除'A'所对应的值

? ? ? DataFrame.drop(label,axis)?

? ? ? label可以是行名也可以是列名,label是行的话axis是0,label是列的话axis是1。

? ?? ** 删除行还可以用 del df['A']

nan是numpy的一种数据类型,np.nan,float类型

任何数据与nan的运算结果都是nan

1、nan in Series

? ? ? Series.isnull()? --返回value为True或者False的Series

? ? ? Series.notnull()? --返回value为True或者False的Series

? ? ? Series.dropna()? --返回删除nan值后的Series

? ? ? Series.fillna(method='ffill')? --前项插值,按照前面的值填充后面的空值

2、nan in DataFrame

? ? ? df.isnull()? --返回value为True或者False的DataFrame

? ? ? df.notnull()? --返回value为True或者False的DataFrame

? ? ? df.dropna(axis=0/1,how='any/all',thresh=None)

? ? ? 说明:axis表示删除行为nan或者列为nan;

? ? ? ? ? ? ? ? any表示只要有一个为空,all表示行中的每个元素或者列中的每个元素为空;

? ? ? ? ? ? ? ? thresh是阈值的意思,表示某行或者某列nan的个数达到阈值的个数时才删除该行或该列。

? ? ? df.fillna(value=1)? ---所有的空值都填充为1

? ? ? df.fillna(value={0:0,1:1,2:2}) ---将0列的空值填为0,1列的空值填为1,2列的空值填为2,默认为填充列

? ? ? 注意:fillna和dropna的特点,生成新的DataFrame,原来的DataFrame不变。

1、多重索引介绍

? ?? Series = pd.Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])

? ? '1','2'为一级索引,'a','b','c'为二级索引

? ? df 可以看做是索引的'1','2'的Series

? ? Series['1']? --Series

? ? Series['1']['a']? --value

? ? Series[:,'a'] --选择'1'和'2'中的'a'对应的值

2、多重索引格式转为二维DataFrame

? ? df = Series.unstack() --转为二维DataFrame

3、多重索引在DataFrame中的操作

1、 map函数与apply函数、applymap函数的区别:

? ? ? 1)map函数对Series中的每个元素作用;

? ? ? 2)applymap函数对DataFrame中的每个元素作用;

? ? ? 3)apply函数对对DataFrame和Series的一列做整体运算。

2、Series.replace(to_replace=[2,3,4],values=[20,30,40])? 替换Series中多个值

? ? Series.replace({1:10,2:20})? 将索引为1的值替换为10,将索引为2的值替换为20

? ? df.sum()? --默认按照列进行求和,nan的值被忽略

? ? df.min()? --默认按照列求最小值

? ? df.max()? --默认按照列求最大值

? ? df.mean()? --默认按照列求平均值

? ? df.describe()? --默认按照列进行描述

? ? df.sum(axis=1)? --按行求和,nan的值被忽略

? ? #axis=0表示对横轴进行操作,但是运算中表现为纵轴操作

? ? #axis=1表示对纵轴进行操作,但是运算中表现为横轴操作

?bins = [0,59,70,80,100],bins是分割范围

?score_cat = pd.cut(Series,bins)? ---得到catgory类型的数据

?DataFrame的分箱技术很棒啊!

?pd['catgory'] = pd.cut(df['a'],bins=[0,59,70,80,100],labels=['low','ok','good','great'])

?--新增一列,将a列的值按照labels进行分类标记,good!!!

?#生成长度为3的随机字符串? pd.util.testing.rands(3)

1、按照一列分组

? ? ? g = df.groupby('city')

? ? ? g是分组类型数据,打印不出来,所以看不到,但是有属性和方法可以间接的了解

? ?? 1) g.groups? --得到分的几个组,和每个组包含的索引

? ?? 2)g.get_group('BJ')? --得到'BJ'所对应的组

? ?? 3)groupby = split +apply +combine

? ? ? ? ?? g.mean()? --求每组的平均值

? ? ? ? ?? g.max() ? --求每组的最大值

? ? ? ? ?? g.min() ? --求每组的最小值

? ? ? ? ?? g.count()

? ? ? ? ?? g.describe()

? ? ? 4)g是一个可迭代对象,可以用list函数将其转化为list

? ? ? ? ? list(g) -- [('组名1',DataFrame1),('组名2',DataFrame2),(),()]

? ? ? ? ? dict(list(g))? --将其转化为字典

? ? ? 同时可以通过for循环进行遍历操作:for item,desc in g:print(item,desc)

? ? ? #怪不得分组后不是DataFrame,因为元组的第一个元素是'分组名'。

2、按照多列分组

? ? ? g_new = df.groupby(['city','wind'])

? ? ? 得到生成器((('分组1','分组2'),DataFrame),(),()...)

? ? ? g_new.get_group(('分组1','分组2'))

? ? ? for (name_1,name_2),group in g_new:

? ? ? ? ? ? ? print((name_1,name_2),group)

?g.mean()? --求每组的平均值

?与g.agg('mean')方法一样

pd.pivot_table(df,index=['',''],aggfuc='sum',values=['',''])

index是分组的组名,values是透视表呈现结果的列,columns是values下的分解

#感觉透视表呈现的结果就是groupby+agg后的结果

#分析者需要对数据结构有一定的了解

df.sort_values(by='',ascending=True/False)[:10]? df可以索引

df.value_counts()? --按值计数

df.['a'] = df['b'].apply(lambda x:x0)? --DataFrame中的True/False

通过g.size()可以看到被groupby之后的数据,得到的是一个Series

1、Series的排序:

? ? 1)对值进行排序

? ? Series.sort_values()? ---直接对Series的值进行排序

? ? 2)通过索引进行排序

? ? Series.sort_index()?

? ? #默认都是升序排列

2、DataFrame的排序

? ?? df.sort_values(by='')? --按照某列的顺序进行排序

? ? df['a'].sort_values()? --返回对a列数据的排序结果,只返回a列

1、df.index = Series(['a','b','c'])? 直接对index赋予新值

2、df.index = df.index.map(str.upper)

? ?? map函数中只传入新的函数名即可

3、df.rename(index=str.upper,columns=str.lower)

? ? ? 或者传递字典,进行一一转换

? ? pd.merge(df1,df2,on=None,how='left/right/inner/outer')

? ? pd.merge(df1,df2)? --没有on参数默认先找相同的columns,然后在columns下找相同的values

? ? pd.merge(df1,df2,on='columns')? --on参数是指按照指定列进行merge

? ? left:表示以左边的数据表为基准,进行填充右面的数据

? ? right:表示以右边的数据表为基准,填充左边的数据

? ? outer:以on的指定列的所有值为基准,填充两边的数据

? ? inner:默认inner,相同on指定的columns下的相同values对应的左右两边的数据

1、concat拼接

? ? pd.concat([Series1,Series2])

? ? pd.concat([df1,df2])? -- 上下叠加,将没有的列进行填充

2、combine组合

? ? Series1.combine_first(Series2)? --用Series2的值去填充Series1中为空的值

? ? df1.combine_first(df2)? ---用df2将df1中的空值填充

? ? df['A'] = df['A'].apply(str.upper)? ---apply函数中也只输入函数名

? ? len(df)? --求df的长度

? ? len(df['a'].unique())? --查看a列中不重复数据的多少

? ? Series.duplicated()? --返回一列True/False的Series

? ? Series.drop_duplicates()? --删除重复值

? ? df.drop_duplicates('a',keep='first/last')

? ? df.drop_duplicates()? --删除完全重复的行

? ? 参数:'a'表示以a列为基准,删除重复值

? ? ? ? ? ? ? first表示保留第一个,last表示保留最后一个

? ? data_list = pd.date_range(start,end,period='D',freq)

? ? period='D',以天为单位

? ? freq = 'W' 以周为单位

? ? freq = 'W-Mon'以每周一位单位

? ? freq = '5H'? 以5h为单位

? ? 以data_range作为索引提取数据比较简单

? ? df[datetime(2017,9,1)]

? ? df['2017-09-01']

? ? df['20170901']

? ? df['201709']

? ? 对时间序列数据进行分组聚合操作:

? ? s1.resample('M').mean()? --以月为单位进行采样,然后求每组的平均值

? ? s1.resample('H').ffill()? --前项填充

? ? s1.resample('H').bfill()? --后项填充

补充:1)jupyter中可以执行linux命令,太棒了!

? ? ? ? ? ? ? ? !ls

? ? ? ? ? ? ? ? !more xxx.csv

? ? ? ? ? ? ? ? !pwd? 等等

? ? ? ? ?? 2)jupyter 查看函数帮助的快捷键:摁住shift + tab? 棒!!!

(责任编辑:IT教学网)

更多

推荐Flash动画文章