↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过
Datawhale干货
作者:耿远昊,Datawhale成员,华东师范大学
pandas 是一个强大的分析结构化数据的工具集,它的使用基础是Numpy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。Pandas做分析数据,可以分为索引、分组、变形及合并四种操作。前边已经介绍过索引操作、分组操作及变形操作,最后对Pandas中的合并操作进行介绍,涉及知识点提纲如下图: 本文目录
1. append与assign 1.1. append方法 1.2. assign方法2. combine与update 2.1. combine方法 2.2. update方法 3. concat方法 4. merge与join 4.1. merge函数 4.2. join函数在详细讲解每个模块之前,首先读入数据:
import numpy as np
import pandas as pd
df = pd.read_csv('joyful-pandas-master/data/table.csv')
df.head()
append与assign
1. append方法(一般用来添加行)
(1)利用序列添加行(必须指定name)
df_append = df.loc[:3,['Gender','Height']].copy() # 默认深拷贝
df_append
s = pd.Series({'Gender':'F','Height':188},name='new_row') # name定义增加的这一行索引名。
df_append.append(s)
(2)用DataFrame添加表
df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]})
df_append.append(df_temp)
从上面可以看到这个索引是不会自动往下续的,因为我们新建的df_temp如下:
pd.DataFrame({'Gender':['F','M'],'Height':[188,176]})
可以看到这个索引就是0和1,如果你直接append而不加参数则就会直接将上面的DataFrame直接和df_append粘在一起而不会改变索引,那么怎么改变索引使得这个索引顺着前面的索引呢?看下面的例子:
df_append.append(df_temp, ignore_index=True)
下面是这个append函数的原形式:
DataFrame.append(self,other,ignore_index=False,verify_integrity=False,sort=False)
其中的ignore_index就是表示是否要跟着前面的索引来定义后面的索引,一般来说是默认False,也就是像我们的第一个例子这样。现在我们将这个参数改成True,就可以顺着索引了,就像上面的这个例子一样。
当然这里也可以自行改变索引名:
df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
df_append.append(df_temp)
其他的参数学习可以参考这个网站:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html?highlight=append#pandas.DataFrame.append
2. assign方法(一般用来添加列)
该方法主要用于添加列,列名直接由参数指定:
s = pd.Series(list('abcd'),index=range(4))
df_append.assign(Letter=s) # 这里定义列名就直接在assign参数定义。
这个一般定义要添加的列Series是没有列索引名的:
s = pd.Series(list('abcd'),index=range(4))
s
可以一次添加多个列:
df_append.assign(col1=lambda x:x['Gender']*2, col2=s)
可以看出这个可以添加任意多个列,但是都是要在参数中依次定义的。
参考学习:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html?highlight=assign#pandas.DataFrame.assign
combine与update
1. combine方法
combine和update都是用于表的填充函数,可以根据某种规则填充。
(1)填充对象
可以看出combine方法是按照表的顺序轮流进行逐列循环的,而且自动索引对齐,缺失值为NaN,理解这一点很重要。
df_combine_1 = df.loc[:1,['Gender','Height']].copy()
df_combine_2 = df.loc[10:11,['Gender','Height']].copy()
df_combine_1.combine(df_combine_2,lambda x,y:print(x))
因为lambda函数是输出x和y,没有返回值所以都为NaN。
df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine(df2, np.minimum)
combine函数原型:
DataFrame.combine(self,other:'DataFrame',func,fill_value = None,overwrite = True)
这里通过多个例子尝试可以发现,func函数是必不可少的,也就是我们必须有一个func来返回数值。
(2)一些例子
例①:根据列均值的大小填充
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [8, 7], 'B': [6, 5]})
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)
例②:索引对齐特性(默认状态下,后面的表没有的行列都会设置为NaN)
df2 = pd.DataFrame({'B': [8, 7], 'C': [6, 5]},index=[1,2])
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)
例③:使得df1原来符合条件的值不会被覆盖
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,overwrite=False)
例④:在新增匹配df2的元素位置填充-1
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,fill_value=-1)
# 也就是将Na