数据分析之合并数据
对DataFrame进行纵向拼接
函数 | 用法 | 返回值 | 是否改变原值 |
concat | Pandas.concat([DataFrame1, DataFrame2, …]) | 拼接后的新DataFrame | 否 |
concat函数的一些参数:
参数 | 赋值 | 作用 |
ignore_index | True | 只保留DataFrame1的索引并对拼接后其他DataFrame索引自动赋值 |
axis | 1 | 对DataFrame进行横向的拼接 |
tip:匹配不上的元素会被赋值为空
对DataFrame进行合并
适用情况 | 函数 | 用法 | 返回值 | 是否改变原值 |
对单个列进行匹配 | merge | Pandas.merge(DataFrame1, DataFrame2, on=列名) | 指定列名上的值相同的行进行合并后的新DataFrame | 否 |
对多个列进行匹配 | merge | Pandas.merge(DataFrame1,DataFrame2, on=[列名1, 列名2, …]) | 指定列名上的值都相同的行进行合并后的新DataFrame | 否 |
列名含义相同,但名称不同 | merge | Pandas.merge(DataFrame1,DataFrame2, left_on=[列名1_1, 列名1_2, …],right_on=[列名2_1, 列名2_2, …]) | left_on和right_on中位置对应的指定列名上的值都相同的行进行合并后的新DataFrame | 否 |
非指定列列名相同 | merge | Pandas.merge(DataFrame1,DataFrame2,suffixes=[后缀1, 后缀2]) | 指定列名上的值相同的行进行合并后,将非指定列列名相同的列的列名分别加上后缀1和后缀2的新DataFrame | 否 |
merge函数的一些参数:
参数 | 赋值 | 作用 |
how | inner | 只保留所有DataFrame匹配行 |
how | outer | 不匹配和匹配行都保留 |
how | left | 保留DataFrame1的所有行,不保留DataFrame2中的不匹配行 |
how | right | 保留DataFrame2的所有行,不保留DataFrame1中的不匹配行 |
根据索引进行合并DataFrame
方法 | 用法 | 返回值 | 是否改变原值 |
join | DataFrame1.join(DataFrame2) | 按照索引合并后的新DataFrame | 否 |
join方法的一些参数:
参数 | 赋值 | 作用 |
how | 与merge函数相同 | 与merge函数相同 |
lsuffix | 后缀1 | 将DataFrame1中的重复列名加上为后缀1 |
rsuffix | 后缀2 | 将DataFrame2中的重复列名加上为后缀2 |
对DataFrame进行分组运算
方法 | 用法 | 返回值 | 是否改变原值 |
groupby | DataFrame.groupby(列名) | 按照列名分组后的DataFrameGroupBy实例 | 否 |
groupby | DataFrame.groupby(列名列表) | 按照列名列表分组后的DataFrameGroupBy实例 | 否 |
得到的DataFrameGroupBy实例一般搭配聚合函数使用,如:
#每个组对于指定列名的平均值 DataFrame.groupby[指定列名].mean()
一般的聚合函数有:
聚合函数 | 作用 |
count() | 得到元素的数量 |
first() | 得到第一个元素 |
last() | 得到最后一个元素 |
mean() | 得到所有元素平均值 |
median() | 得到所有元素中位数 |
min() | 得到所有元素的最小值 |
max() | 得到所有元素的最大值 |
std() | 得到所有元素的标准差 |
var() | 得到所有元素的方差 |
prod() | 得到所有元素的积 |
sum() | 得到所有元素的和 |
当然也可以使用apply方法来使用一些自定义的聚合函数
由于groupby是按数值分组,可能每个数值都分一个组,会导致分组过后有很多组,还是难以分析数据
解决方法:
函数 | 用法 | 返回值 | 是否改变原值 |
cut | Pandas.cut(Serises, 自定义分组列表,自定义分组标签列表) | 按照自定义分组列表对的Serises内的元素进行分组标签赋值后的category类型Serises | 否 |
例子:
bins = [10, 20, 30, 40] labels = ["儿童", "青少年", "青年", "壮年"] # 获得对DataFrame指定列进行分组标签赋值后的category类型Serises temp = Pandas.cut(DataFrame[列名], bins, label=labels) # 通过这个Series创建一个新列 DataFrame[新列名] = temp # 然后再对这个列进行groupby操作 DataFrame.groupby(新列名).聚合函数()
如果按照多个列名进行groupby方法的话,生成的DataFrameGroupBy实例是具有嵌套索引的,例如:
temp = DataFrame.groupby([列名1, 列名2]).聚合函数() # 这里的temp.loc[列名1]会以列名2的值作为索引
如果不想要嵌套索引的方法:
方法 | 用法 | 返回值 | 是否改变原值 |
reset_index | DataFrame.reset_index() | 重置索引后的新DataFrame | 否 |
Pandas的透视表
透视表就是基于原始数据对表进行重塑
函数 | 用法 | 返回值 | 是否改变原值 |
pivot_table | Pandas.pivot_table(DataFrame,index=[列名1_1,列名1_2,…],columns=列名2_1,values=列名3_1,aggfunc=聚合函数) | 基于DataFrame数据的透视表 | 否 |
DataFrame的另一种条件筛选方法
函数 | 用法 | 返回值 | 是否改变原值 |
query | DataFrame.query(条件字符串) | 条件筛选后的新DataFrame | 否 |