合并表、数据清洗

合并表

1. 表堆叠 – 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)

参数含义

  • objs:Series,DataFrame或Panel对象的序列或映射。如果传递了dict,则排序的键将用作键参数,除非它被传递,在这种情况下,将选择值(见下文)。任何无对象将被静默删除,除非它们都是无,在这种情况下将引发一个ValueError。
  • axis:{0,1,…},默认为0。沿着连接的轴。
  • join:{‘inner’,‘outer’},默认为“outer”。如何处理其他轴上的索引。outer为联合和inner为交集。
  • ignore_index:boolean,default False。如果为True,请不要使用并置轴上的索引值。结果轴将被标记为0,…,n-1。如果要连接其中并置轴没有有意义的索引信息的对象,这将非常有用。注意,其他轴上的索引值在连接中仍然受到尊重。
  • join_axes:Index对象列表。用于其他n-1轴的特定索引,而不是执行内部/外部设置逻辑。
  • keys:序列,默认值无。使用传递的键作为最外层构建层次索引。如果为多索引,应该使用元组。
  • levels:序列列表,默认值无。用于构建MultiIndex的特定级别(唯一值)。否则,它们将从键推断。
  • names:list,default无。结果层次索引中的级别的名称。
  • verify_integrity:boolean,default False。检查新连接的轴是否包含重复项。这相对于实际的数据串联可能是非常昂贵的。
  • copy:boolean,default True。如果为False,请勿不必要地复制数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#读取数据
data1 = pd.read_excel("meal_order_detail.xlsx",sheet_name=0)
data2 = pd.read_excel("meal_order_detail.xlsx",sheet_name=1)
#对两个表数据进行组合
all_data1 = pd.concat((data1,data2),axis=0,join="outer")
all_data2 = pd.concat((data1,data2),axis=1,join="inner")

print(data1.shape)
print(data2.shape)
print(all_data1.shape)

2. 主键合并 marge()函数 通过键拼接列

根据表中的元素取值是否相同来进行拼接(以左表为主,不考虑右表),跟行列索引无关

pandas提供了一个类似于关系数据库的连接(join)操作的方法merage,可以根据一个或多个键将不同DataFrame中的行连接起来

用于通过一个或多个键将两个数据集的行连接起来,类似于 SQL 中的 JOIN。

该函数的典型应用场景是:针对同一个主键存在两张包含不同字段的表,现在我们想把他们整合到一张表里。在此典型情况下,结果集的行数并没有增加,列数则为两个元数据的列数和减去连接键的数量。

  • on=None 用于显示指定列名(键名),如果该列在两个对象上的列名不同,则可以通过 left_on=None, right_on=None 来分别指定。或者想直接使用行索引作为连接键的话,就将 left_index=False, right_index=False 设为True。
  • how=‘inner’ 参数指的是当左右两个对象中存在不重合的键时,取结果的方式:inner 代表交集;
  • 代表并集;left 和 right 分别为取一边。
  • suffixes=(’_x’,’_y’) 指的是当左右对象中存在除连接键外的同名列时,结果集中的区分方式,可以各加一个小尾巴。
  • 对于多对多连接,结果采用的是行的笛卡尔积。

语法

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
      left_index=False, right_index=False, sort=True,
      suffixes=('_x', '_y'), copy=True, indicator=False)
  • left与right:两个不同的DataFrame
  • how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
  • on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
  • left_on:左则DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
  • right_on:右则DataFrame中用作 连接键的列名
  • left_index:使用左则DataFrame中的行索引做为连接键
  • right_index:使用右则DataFrame中的行索引做为连接键
  • sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
  • suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为(’_x’,’_y’)
  • copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
  • indicator:在 0.17.0中还增加了一个显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                         'C': ['C0', 'C1', 'C2', 'C3'],
                         'D': ['D0', 'D1', 'D2', 'D3']})

#一个主键、默认左内连接(等同于内连接),how后面只能跟一个值
data1 = pd.merge(left,right,how="outer",on="key1")
#多个主键
data2 = pd.merge(left,right,how="inner",on=["key1","key2"])
# data3 = pd.merge(left,right,how="left",on=["key1","key2"])
# data4= pd.merge(left,right,how="right",on=["key1","key2"])
# print(data1)
# print(data2)

#当两个表中,两个主键名称不一样时
data5 = pd.merge(left,right,how="inner",left_on="key2",right_on="key1")
# print(data5)

3. 重叠合并combine_first()函数

  • 当两个表结构基本相同,但是两个表中都有缺失数据,可以利用重叠合并来拼凑数据,构建一个完整的表
  • df1.combine_first(df2):利用df2来完善df1,当df1、df1中都有数据的时候以df1为准
dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}
dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}
         
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)

# print(df1)
# print(df2)

#以前表作为基表
res1 = df1.combine_first(df2)
res2 = df2.combine_first(df1)
# print(res1)
# print(res2)

4.join 拼接列,主要用于索引上的合并

join方法提供了一个简便的方法用于将两个DataFrame中的不同的列索引合并成为一个DataFrame
语法

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False)

其中参数的意义与merge方法基本相同,只是join方法默认为左外连接how=left
1.默认按索引合并,可以合并相同或相似的索引,不管他们有没有重叠列。
2.可以连接多个DataFrame
3.可以连接除索引外的其他列
4.连接方式用参数how控制
5.通过lsuffix=’’, rsuffix=’’ 区分相同列名的列

参考链接:https://blog.youkuaiyun.com/zutsoft/article/details/51498026

数据清洗

在这里插入图片描述
1.检测处理空值、缺失值

  1. isnull,notnull
#获取每列空值的总和
isnull_sum = detail.isnull().sum()
#若整列值都为空时则删除该列
mask = detail.shape[0]==isnull_sum
#
labels = mask.index[mask]
detail.drop(labels,axis=1,inplace=True)

  1. dropna(),删除缺失值how=“any”/“all”
detail.dropna(axis=0,how="any",inplace=True)
  1. fillna 填充空值
detail1 = detail.fillna(0)
  1. 插值法

(1)interp1d 线性拟合插值, 1d,不是ld
from scipy.interpolate import interp1d

x = np.array([1, 2, 3, 4, 5, 8, 9, 10])
y1 = np.array([2, 8, 18, 32, 50, 128, 162, 200])#2*n^2
y2= np.array([3, 5, 7, 9, 11, 17, 19, 21])#2n+1

Linear1= interp1d(x,y2,kind="linear")#线性拟合插值
Linear2= interp1d(x,y1,kind="linear")#线性拟合插值
print(Linear1([6,7]))

(2)lagrange 拉格朗日插值

from scipy.interpolate import lagrange
Larg1 = lagrange(x,y1)
Larg2 = lagrange(x,y2)
print(Larg2([6,7]))

(3)spline 样条数据插值

from scipy.interpolate import spline
res = spline(x, y1, xnew=np.array([6, 7]))
print(res)

2. 检测处理重复值

  1. 单列去重 (去行)
  • 类似numpy中的unique,去除数组重复值
  • keep:保留第几个重复值,默认为first、last、False:都不保留
import pandas as pd
import numpy as np
import  matplotlib.pyplot as plt

right = pd.DataFrame({'key1': ['K0', 'K1', 'K0', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                         'C': [1, 1, 2, 3],
                         'D': [2, 2, 4, 6],
                         "E": [1, 1, 4, 5]
                      })

data_drop = right["key1"].drop_duplicates(keep=False)
  1. 表去重(多行去重)
shape_det = right.drop_duplicates(subset=["key1","key2"])
  1. 特征重复(去列) 计算相似度
corr_det = right[["C","D","E"]].corr(method="pearson")#spearman
mask = corr_det==1
print(mask)

3. 异常值 3西格玛原则

columns_num = ["单价","销量"]

for column in columns_num:

    #异常值,x<u-3西格玛 | x>u-3西格玛
    mask1 = order[column]<order[column].mean()-3*order[column].std()
    mask2 = order[column]>order[column].mean()+3*order[column].std()
    mask = mask1|mask2
    # print(mask)
    index_exception = order.index[mask]

    order.drop(index_exception,axis=0,inplace=True)

4. 标准化方式

(1)离差标准化 (x-min)/(max-min)

data1 = (detail1["amounts"] - detail1["amounts"].min()) / (detail1["amounts"].max() - detail1["amounts"].min())

(2)标准差标准化 x1 = x-u/σ

data2 = (detail1["amounts"]-detail1["amounts"].mean())/detail1["amounts"].std()

(3)小数定标标准化x1 = x/10^k

data3= detail1["amounts"]/10**(np.log10(detail1["amounts"].abs().max()))

5. 哑变量处理

  • 将类别型数据转换为one-hot编码—>数值型矩阵
data4 = pd.get_dummies(detail1["dishes_name"].head())

6. 离散化联系型数据

  • value_counts()是统计每一列中不同类别各有多少个,此方法只适用于series序列类型

(1)等宽法切割:可能使得不同的类别频率差值较大

# 将数据平均分成5个区间
#value_counts()是统计每一列中不同类别各有多少个,此方法只适用于series序列类型
data5 = pd.cut(detail1["amounts"],5)
print(data5.value_counts())

(2)等频法切割:

data6 = pd.qcut(detail1["amounts"],5)
print(data6.value_counts())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YouShouldKnowMe

别来这套

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值