首页 > 代码库 > 数据分析之数据规整化

数据分析之数据规整化

数据规整化:清理、转换、合并、重塑

1.合并数据集

pandas对象中的数据可以通过一些内置的方式进行合并:

  pandas.merge

  pandas.concat:沿一条轴线将多个对象进行堆叠

  combine_first:重复数据连接,用一个对象中的值填充另一个缺失值

 

1.1 数据库风格的DataFrame合并

  pd.merge(df1,df2)  合并其中column名字相同的数据。

  pd.merge(df1,df2, left_on = ‘1key‘, right_on = ‘rkey‘) 两个对象的列名不同,可以对其进行分别指定。

  默认情况下,上述merge进行的是‘inner’连接(交集),并集(outer),依据左边键(left),依据右边键(right)

  pd.merge(df1,df2,how=‘inner’) 

  若在键存在一对多是,产生的是行的笛卡尔积,左边2个b行,右边两个b行,最终合并结果中会有6个b行。

  pd.merge(left,right,on=‘key1‘,suffixes=(‘_left‘,‘_right‘)) 为重复的列名添加下标。

  pd.merge(left1,right1,left_on=‘key‘,right_index=True),试图链接的连接键位于索引之中。

  left2.join(right2,how=‘outer’) 直接实现对索引的连接。

  left2.join([right2, another])

 

 

1.2 轴向连接

  另一种数据合并的方式叫做连接,绑定,堆叠。concat函数实现将值和索引粘合在一起。

  pd.concat([s1,s2,s3])

  默认情况下,该函数是在axis=0上进行工作,如果传入axis=1,则结果变为一个DataFrame(axis = 1列)

  pd.concat([s1,s4], axis=1, join=‘inner‘) 传入join值可以实现得到他们的交集

  pd.concat([s1,s4], axis = 1, join_axes =[[‘a‘,‘c‘,‘b‘,‘e‘]])在指定的轴上使用索引

  result = pd.concat([s1,s2,s3],keys=[‘one‘,‘two‘,‘three‘])连接轴上创建一个层次化索引

  result = pd.concat([s1,s2,s3],axis=1,keys=[‘one‘,‘two‘,‘three‘])按照axis=1对Series进行合并,则keys可以成为DataFrame的列头。

 

1.3合并重叠数据

  b[:-2].combine_first(a[2:])

  对缺失数据进行补齐

  技术分享

技术分享

技术分享

 df1.combine_first(df2) 用括号内的数据为前置数据补充。

重塑和轴向旋转

有许多用于重新排列表格型数据的基础运算。这些函数也称为重塑(reshape)或轴转向(pivot)运算。

层次化索引为DataFrame数据重排列任务提供了良好的一致性。

stack:将数据的列“旋转”为行

unstac:将数据的行“旋转”为列

 

数据转换

本章到目前为止介绍的都是数据的重排。另一类重要操作则是过滤、清理以及其他的转换工作。

df1.duplicated() 对列进行判断,返回是否重复的布尔值

df2.drop_duplicates()返回一个删除了重复行的DataFrame

df2.drop_duplicates([‘k1‘])  按照k1列删除重复项

上述默认保留第一个出现的值得组合

传入take_last = True 则保留最后一个:

data.drop_duplicates([‘k1‘,‘k2‘],take_last=True)

data[‘animal‘] = data[‘food‘].map(str.lower).map(meat_to_animal) 其中 meat_to_animal 是字典类型,字典的键为DataFrame中已经存在的列,字典的值为想要添加的新列。

 

替换

data.replace(-999,np.nan) 实现产生一个新的Series  data.replace([-999, -1000], np.nan)

data.replace([-999,-1000],[np.nan, 0])  同时传入的参数也可以是字典 data.replace({-999:np.nan, -1000:0})

 

data.index.map(str.upper)

离散化和面元划分

为了便于分析,连续的数据通常被离散化或者拆分为“面元”(bin)。

bins = [12, 25, 35, 60, 100]

cats = pd.cut(ages,bins) 对ages 这个列表按bins的分布进行划分。

cats.labels 输出的分类后具体属于哪一类。返回[1,2,3,1..]    cats.levels   pd.value_counts(cats)

 

数据分析之数据规整化