在前几篇关于 pandas 的文章中,笔者分别介绍了:
pandas 的基本数据结构、数据对象的创建和查看;
pandas 数据的数值运算、统计和排序;
对 DataFrame 类型数据的索引和轴进行的一些操作。
本篇介绍添加数据和合并数据。
给已有DataFrame添加一列,可以使用直接赋值:df[‘列名’] = [‘值’] 或者 df[‘列名’] = Series对象,也可以使用 assign 方法:
df.assign(**kwargs)
给已有DataFrame/Series添加行,可采用 append 方法:
df.append(other, ignore_index=False, verfy_integrity=False, sort=False)
或者series.append(to_append, ignore_index=False, verfy_integrity=False)
给已有DataFrame/Series添加特定数据可以使用 combine_first 和 combine 方法:
df.combine_first(other_df)
或者 series.combine_first(other_series)
df.combine(other_df, func, fill_value, overwrite=True)
或者 series.combine(other_series, func, fill_value)
上述示例如下:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'c1':[1,2,9,6,8],'c3':[5,2,1,7,1],'c4':[3,5,0,2,0]},index = ['a','c','d','f','p'])
df1['c2'] = [-2,0,-3,-5,9] # 直接赋值添加一列
df1['c5'] = df['c3'] / df['c1'] # 通过运算添加一列
df1.assign(col5=[-12,13,14,15,16],col6=[2,1,4,1,6]) # 添加两列
df1.assign(col5=df["c1"] * 3 / 4 + 25) # 通过运算添加一列
df1.assign(col5=lambda x: x.c1 / 2 + 20) # 通过函数添加一列
df2 = pd.DataFrame({'c1':[0,1],'c2':[-2,7],'c3':[-9,5]},index = ['a','c'])
df3 = pd.DataFrame({'c1':['pp','po'],'c2':[90,70],'c3':[-9,5]})
df1.append(df2)
df1.append([df2, df3])
data_dict = {'c1':'n1','c2':'n2','c3':'n3','c4':'n4'}
df1.append(data_dict, ignore_index=True) # 使用字典添加行,ignore_index必须为True
df1.combine_first(df2) # 填补空缺、增加数据
df1.combine(df2, func=lambda x,y: y if np.isnan(x['a']) else x) # 根据函数添加合并数据
整理数据时,可能需要多张表格组合到一起才能进行某些问题的分析,因此数据合并也是常用操作,主要有 concat、merge、join 三个方法,其中:concat 是 pandas 内置方法,join 是 DataFrame 类对象方法,merge 既是 pandas 内置方法也是 DataFrame 类对象方法。
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys, levels, names, verify_integrity=False, sort=False, copy=True)
该方法是拼接,即把多个数据拼接起来,常用参数是:
objs:待拼接的、一个元素为 Series/DataFrame 的序列或者字典。
axis:取 0/‘index’/,表示竖着拼接增加行;取 1/‘columns’,表示横着拼接增加列。
join:指定拼接时如何处理其他轴上的索引,可以为 ‘inner’ 或 ‘outer’ 。
ignore_index:是否忽略原索引,如果为 True,则拼接后索引取值为 0,1,2…
pd.merge(left, right, how='inner', on, left_on, right_on, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate)
该方法根据一或者多个键将不同 DataFrame 的行连接起来,实现的是数据库的连接操作,常用参数是:
left、right:待合并的 DataFrame 对象。若是 DataFrame 对象方法则只有right 。
how:指定连接类型,可以是:‘left’(左连接)、‘right’(右连接)、‘outer’(外连接)、‘inner’(内连接,默认)。
on:指定用作连接键的列的 label,必须在两个 DataFrame 中都存在,如果为None,则使用两个 DataFrame 的列 label 的交集。也可以通过 left_on/right_on 参数分别指定两侧 DataFrame 对齐的连接键。
suffixes:一个二元序列。对于结果中同名的列,它会添加前缀来指示它们来自哪个 DataFrame。
df.join(other, on, how='left', lsuffix='', rsuffix='', sort=False)
该方法是 merge 的简化版,当所有的连接键来自于某列值,则可以使用函数。
on:指定以调用者的那个 column 对应的列为键。
how:参考 merge 的 how 。
lsuffic/rsuffix:参考 merge 的 suffixes,如果结果中有重名的列,则必须指定它们之一。
示例如下:
pd.concat([df1,df2,df3]) # 竖着拼接df1/df2/df3
pd.merge(df1, df2, how='left', on='c3') # 与 df1.merge(df2, how='left', on='c3') 相同
df4 = pd.DataFrame({'c1':[-1,-2,9,-6,8],'c3':[-5,2,-1,7,1],'c4':[-3,-5,0,-2,0]})
df1.join(df4, on='c3', how='inner', lsuffix='xx', rsuffix='==') # 使用df1的'c3'进行拼接
以上。