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
df2=DataFrame(
{'key':list('abd'),'data2':np.arange(1,4)*10}
)
df2
(1)pd.merge采用inner连接 取交集,没有交集的舍弃
pd.merge(df1,df2)
默认是以相同的列名称为键 进行合并 一般情况下 建议用on=’’ 制定一下
pd.merge(df1,df2,on='key')
默认 how=‘inner’ 取交集,how=‘outer’ 取并集
pd.merge(df1,df2,how='outer')
如果没有相同的列
在创建两个没有相同列的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)
没有相同的列,可以用left_on=’’ right_on=’’
pd.merge(df3,df4,left_on='Lkey',right_on='Rkey')
how=left 以左边为主 how=right 右边为主 mysql左连接与右链接
pd.merge(df3,df4,left_on='Lkey',right_on='Rkey',how='left')
(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)
#多列合并
pd.merge(df_left,df_right,on=['key1','key2'],how='outer')
如果完全没有相同列
先创建没有相同列的两个数据
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)
#多列合并
pd.merge(df_5,df_6,left_on=['key1','key2'],right_on=['key3','key4'],how='outer')
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
连接
pd.concat([s1,s2],axis=0)
pd.concat([s1,s2,s3],axis=1)
pd.concat([s1,s2,s3],axis=1,join='inner')
可以使用keys=[]将原来参与合并的数据进行标记,标记后会形成多层索引
s4=pd.concat([s1,s2,s3],axis=0,keys=['one','tow','three'])
s4
s4=pd.concat([s1,s2,s3],axis=1,keys=['one','tow','three'])
s4
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)
s6.combine_first(s7)
创建两个带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)
df7.combine_first(df8)
4.xxx.combine(yyy.func)运算合并
先创建两个DataFrame
df5=DataFrame([[1,20],[10,3]])
df5
df6=DataFrame([[12,2],[4,30]])
df6
#保留合并位最大值
df5.combine(df6,func=np.maximum)
#保留合并位最小值
df5.combine(df6,func=np.minimum)
上一篇: 如何控制概率?思路怎么
下一篇: IDEA类和方法注释模板设置