pandas中concat函数(pandas append concat)
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? 棒!!!