欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python-pandas模块6-合并数据集

程序员文章站 2022-06-05 19:31:52
...

pandas模块-合并数据集

导入模块:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from numpy import nan as NA

1.pd.merge() dataframe和dataframe合并

创建两个DataFrame用了来连接

df1=DataFrame(
    {'key':list('aabbabc'),'data1':np.arange(7)*10}
)
df1

python-pandas模块6-合并数据集

df2=DataFrame(
    {'key':list('abd'),'data2':np.arange(1,4)*10}
)
df2

python-pandas模块6-合并数据集

(1)pd.merge采用inner连接 取交集,没有交集的舍弃
pd.merge(df1,df2)

python-pandas模块6-合并数据集
默认是以相同的列名称为键 进行合并 一般情况下 建议用on=’’ 制定一下

pd.merge(df1,df2,on='key')

python-pandas模块6-合并数据集
默认 how=‘inner’ 取交集,how=‘outer’ 取并集

pd.merge(df1,df2,how='outer')

python-pandas模块6-合并数据集

如果没有相同的列

在创建两个没有相同列的DataFrame

df3 = DataFrame(
    { 'Lkey':list('aabbabc') , 'data1':np.arange(7)*10}
)
df4 = DataFrame(
    {'Rkey':list('abd') ,'data2':np.arange(1,4)*10}  
)
print(df3)
print(df4)

python-pandas模块6-合并数据集
没有相同的列,可以用left_on=’’ right_on=’’

pd.merge(df3,df4,left_on='Lkey',right_on='Rkey')

python-pandas模块6-合并数据集
how=left 以左边为主 how=right 右边为主 mysql左连接与右链接

pd.merge(df3,df4,left_on='Lkey',right_on='Rkey',how='left')

python-pandas模块6-合并数据集

(2)多列数据合并

创建数据

df_left=DataFrame({
    'key1':'foo/foo/foo/bar/bar'.split('/'),
    'key2':'one,tow,one,one,tow'.split(','),
    'Lvalue':[10,20,30,40,50]
})
df_right=DataFrame({
    'key1':'bar,foo,foo'.split(','),
    'key2':'one,one,tow'.split(','),
    'Rvalue':[6,7,8]
})
print(df_left)
print(df_right)

python-pandas模块6-合并数据集

#多列合并
pd.merge(df_left,df_right,on=['key1','key2'],how='outer')

python-pandas模块6-合并数据集
如果完全没有相同列

先创建没有相同列的两个数据

df_5=DataFrame({
    'key1':'foo/foo/foo/bar/bar'.split('/'),
    'key2':'one,tow,one,one,tow'.split(','),
    'Lvalue':[10,20,30,40,50]
})
df_6=DataFrame({
    'key3':'one,one,tow'.split(','),
    'key4':'one,one,tow'.split(','),
    'Rvalue':[6,7,8]
})
print(df_5)
print(df_6)

python-pandas模块6-合并数据集

#多列合并
pd.merge(df_5,df_6,left_on=['key1','key2'],right_on=['key3','key4'],how='outer')

python-pandas模块6-合并数据集

2.pd.concat(obj,axis=0,join=‘outer’) series和series

obj:iterable可迭代的

创建Series

s1=Series([0,10],index=['a','b'])
s1
s2=Series([20,30,40],index=['c','d','e'])
s2
s3=Series([5,6],index=['f','g'])
s3

python-pandas模块6-合并数据集
python-pandas模块6-合并数据集
python-pandas模块6-合并数据集
连接

pd.concat([s1,s2],axis=0)

python-pandas模块6-合并数据集

pd.concat([s1,s2,s3],axis=1)

python-pandas模块6-合并数据集

pd.concat([s1,s2,s3],axis=1,join='inner')

python-pandas模块6-合并数据集
可以使用keys=[]将原来参与合并的数据进行标记,标记后会形成多层索引

s4=pd.concat([s1,s2,s3],axis=0,keys=['one','tow','three'])
s4

python-pandas模块6-合并数据集

s4=pd.concat([s1,s2,s3],axis=1,keys=['one','tow','three'])
s4

python-pandas模块6-合并数据集

3.xxx.combine_frist()

一左边非nan为主,
如果左边的值nan 右边的不是,用右边的,
左边索引上没有值,用右边的,

创建两个series其中一个带NaN(因为导入了模块from numpy import nan as NA,所以用NA来创建nan)

s6=Series([NA,2,NA,4,5,NA],index=list('fedbac'))
s7=Series([10,20,30,40],index=list('febg'))
print(s6)
print(s7)

python-pandas模块6-合并数据集

s6.combine_first(s7)

python-pandas模块6-合并数据集
创建两个带NaN的DataFrame

df7=DataFrame({
    'a':[1,NA,5,NA],
    'b':[NA,2,NA,6],
    'c':[2,4,6,8]
})
df8 = DataFrame({
    'a':[50,NA,40,NA,NA],
    'b':[40,50,60,70,80]
})
print(df7)
print(df8)

python-pandas模块6-合并数据集

df7.combine_first(df8)

python-pandas模块6-合并数据集

4.xxx.combine(yyy.func)运算合并

先创建两个DataFrame

df5=DataFrame([[1,20],[10,3]])
df5

python-pandas模块6-合并数据集

df6=DataFrame([[12,2],[4,30]])
df6

python-pandas模块6-合并数据集

#保留合并位最大值
df5.combine(df6,func=np.maximum)

python-pandas模块6-合并数据集

#保留合并位最小值
df5.combine(df6,func=np.minimum)

python-pandas模块6-合并数据集

相关标签: python