Pandas统计分析基础(5):DataFrame的合并(内含大量代码可供练习)

✅作者简介:大家好我是Xlong,一枚正在学习COMSOL、Python的工科研究僧
📃个人主页: Xlong的个人博客主页
🔥系列专栏: Python大数据分析
💖如果觉得博主的文章还不错的话,请👍支持一下博主哦🤞

在上篇文章中主要介绍了DataFrame的数据分析及画图功能。本文主要介绍DataFrame的合并。

目录

一、前言

二、DataFrame的合并

2.1 concat方法

2.1.1 concat横向合并

2.1.2 concat纵向合并

2.1.3 append方法的纵向合并

2.1.4 使用concat合并时,可以添加keys参数来区分来自哪个DataFrame

2.2 使用join函数合并表,常用于行索引相同的两个DataFrame

2.3 使用merge方法进行合并

一、前言

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
print(pop.head(),'\n') #DataFrame.head()  可以读取Dataframe的前n行,默认n=5
print(len(gdp))   #len()可以返回DtaFrame的行数

运行结果:
2018年
省份
北京市 2154
天津市 1560
河北省 7556
山西省 3718
内蒙古自治区 2534
31

二、DataFrame的合并

DataFrame可以保存任意维度的数据。 我们尝试将gdp和pop两个dataframe合并成一个。

2.1 concat方法

2.1.1 concat横向合并

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df=pd.concat([gdp,pop],axis=1) ##axis=0是纵向,=1是横向
print(df)

运行结果:
2018年 2018年
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487

因此需要修改列名,使用DataFrame.rename()方法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
#字典中,key为旧名字,value为新名字,key值不存在就不不改名,不会报错
print(gdp)

运行结果:
GDP
省份
北京市 30319.98
天津市 18809.64
河北省 36010.27
山西省 16818.11
内蒙古自治区 17289.22
辽宁省 25315.35
吉林省 15074.62
黑龙江省 16361.62
上海市 32679.87
江苏省 92595.40
浙江省 56197.15
安徽省 30006.82
福建省 35804.04
江西省 21984.78
山东省 76469.67
河南省 48055.86
湖北省 39366.55
湖南省 36425.78
广东省 97277.77
广西壮族自治区 20352.51
海南省 4832.05
重庆市 20363.19
四川省 40678.13
贵州省 14806.45
云南省 17881.12
西藏自治区 1477.63
陕西省 24438.32
甘肃省 8246.07
青海省 2865.23
宁夏回族自治区 3705.18
新疆维吾尔自治区 12199.08

先建好改名字典再统一改

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
print(pop)

运行结果:
POP
省份
北京市 2154
天津市 1560
河北省 7556
山西省 3718
内蒙古自治区 2534
辽宁省 4359
吉林省 2704
黑龙江省 3773
上海市 2424
江苏省 8051
浙江省 5737
安徽省 6324
福建省 3941
江西省 4648
山东省 10047
河南省 9605
湖北省 5917
湖南省 6899
广东省 11346
广西壮族自治区 4926
海南省 934
重庆市 3102
四川省 8341
贵州省 3600
云南省 4830
西藏自治区 344
陕西省 3864
甘肃省 2637
青海省 603
宁夏回族自治区 688
新疆维吾尔自治区 2487

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
print(df_combine)

运行结果:
GDP POP
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487

2.1.2 concat纵向合并

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
df1=df_combine[:][0:5]
df2=df_combine[:][5:]
print(df1,'\n')
print(df2)

运行结果:
GDP POP
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534
GDP POP
省份
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
df1=df_combine[:][0:5]
df2=df_combine[:][5:]
df3=pd.concat([df2,df1],axis=0) #axis=0表示纵向合并
print(df3)

运行结果:
GDP POP
省份
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
df1=df_combine[:][0:5]
df2=df_combine[:][5:]
df3=pd.concat([df2,df1],axis=0) #axis=0表示纵向合并
print(df1,'\n')
print(df2)

运行结果:
GDP POP
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534
GDP POP
省份
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487

2.1.3 append方法的纵向合并

Pandas统计分析基础(5):DataFrame的合并(内含大量代码可供练习)
a = [0]
a.append(8)
print(a)

运行结果:
[0, 8]

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
df1=df_combine[:][0:5]
df2=df_combine[:][5:]
df3=pd.concat([df2,df1],axis=0) #axis=0表示纵向合并
df4=df1.append(df2)
print(df4)

运行结果:
GDP POP
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534
辽宁省 25315.35 4359
吉林省 15074.62 2704
黑龙江省 16361.62 3773
上海市 32679.87 2424
江苏省 92595.40 8051
浙江省 56197.15 5737
安徽省 30006.82 6324
福建省 35804.04 3941
江西省 21984.78 4648
山东省 76469.67 10047
河南省 48055.86 9605
湖北省 39366.55 5917
湖南省 36425.78 6899
广东省 97277.77 11346
广西壮族自治区 20352.51 4926
海南省 4832.05 934
重庆市 20363.19 3102
四川省 40678.13 8341
贵州省 14806.45 3600
云南省 17881.12 4830
西藏自治区 1477.63 344
陕西省 24438.32 3864
甘肃省 8246.07 2637
青海省 2865.23 603
宁夏回族自治区 3705.18 688
新疆维吾尔自治区 12199.08 2487

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
gdp.rename(columns={'2018年': 'GDP'},inplace=True)
pop_newname={'2018年': 'POP'}
pop.rename(columns=pop_newname,inplace=True)
df_combine=pd.concat([gdp,pop],axis=1)  #axis=1即行索引
df1=df_combine[:][0:5]
df2=df_combine[:][5:]
df3=pd.concat([df2,df1],axis=0) #axis=0表示纵向合并
df4=df1.append(df2)
print(df1)

运行结果:
GDP POP
省份
北京市 30319.98 2154
天津市 18809.64 1560
河北省 36010.27 7556
山西省 16818.11 3718
内蒙古自治区 17289.22 2534

可见,上述合并方式均不会改变原DataFrame

2.1.4 使用concat合并时,可以添加keys参数来区分来自哪个DataFrame

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
print(pop.head())

运行结果:
2018年
省份
北京市 2154
天津市 1560
河北省 7556
山西省 3718
内蒙古自治区 2534

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
#print(pop.head())
print(pop.index)

运行结果:
Index([‘北京市’, ‘天津市’, ‘河北省’, ‘山西省’, ‘内蒙古自治区’, ‘辽宁省’, ‘吉林省’, ‘黑龙江省’, ‘上海市’,
‘江苏省’, ‘浙江省’, ‘安徽省’, ‘福建省’, ‘江西省’, ‘山东省’, ‘河南省’, ‘湖北省’, ‘湖南省’, ‘广东省’,
‘广西壮族自治区’, ‘海南省’, ‘重庆市’, ‘四川省’, ‘贵州省’, ‘云南省’, ‘西藏自治区’, ‘陕西省’, ‘甘肃省’,
‘青海省’, ‘宁夏回族自治区’, ‘新疆维吾尔自治区’],
dtype=’object’, name=’省份’)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(df5)

运行结果:
2018年
省份
pop 北京市 2154.00
天津市 1560.00
河北省 7556.00
山西省 3718.00
内蒙古自治区 2534.00
… …

gdp 陕西省 24438.32
甘肃省 8246.07
青海省 2865.23
宁夏回族自治区 3705.18
新疆维吾尔自治区 12199.08
[62 rows x 1 columns]

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(df5.index) #index变成了2个元素的tuple组成的MultiIndex

运行结果:
MultiIndex([(‘pop’, ‘北京市’),
(‘pop’, ‘天津市’),
(‘pop’, ‘河北省’),
(‘pop’, ‘山西省’),
(‘pop’, ‘内蒙古自治区’),
(‘pop’, ‘辽宁省’),
(‘pop’, ‘吉林省’),
(‘pop’, ‘黑龙江省’),
(‘pop’, ‘上海市’),
(‘pop’, ‘江苏省’),
(‘pop’, ‘浙江省’),
(‘pop’, ‘安徽省’),
(‘pop’, ‘福建省’),
(‘pop’, ‘江西省’),
(‘pop’, ‘山东省’),
(‘pop’, ‘河南省’),
(‘pop’, ‘湖北省’),
(‘pop’, ‘湖南省’),
(‘pop’, ‘广东省’),
(‘pop’, ‘广西壮族自治区’),
(‘pop’, ‘海南省’),
(‘pop’, ‘重庆市’),
(‘pop’, ‘四川省’),
(‘pop’, ‘贵州省’),
(‘pop’, ‘云南省’),
(‘pop’, ‘西藏自治区’),
(‘pop’, ‘陕西省’),
(‘pop’, ‘甘肃省’),
(‘pop’, ‘青海省’),
(‘pop’, ‘宁夏回族自治区’),
(‘pop’, ‘新疆维吾尔自治区’),
(‘gdp’, ‘北京市’),
(‘gdp’, ‘天津市’),
(‘gdp’, ‘河北省’),
(‘gdp’, ‘山西省’),
(‘gdp’, ‘内蒙古自治区’),
(‘gdp’, ‘辽宁省’),
(‘gdp’, ‘吉林省’),
(‘gdp’, ‘黑龙江省’),
(‘gdp’, ‘上海市’),
(‘gdp’, ‘江苏省’),
(‘gdp’, ‘浙江省’),
(‘gdp’, ‘安徽省’),
(‘gdp’, ‘福建省’),
(‘gdp’, ‘江西省’),
(‘gdp’, ‘山东省’),
(‘gdp’, ‘河南省’),
(‘gdp’, ‘湖北省’),
(‘gdp’, ‘湖南省’),
(‘gdp’, ‘广东省’),
(‘gdp’, ‘广西壮族自治区’),
(‘gdp’, ‘海南省’),
(‘gdp’, ‘重庆市’),
(‘gdp’, ‘四川省’),
(‘gdp’, ‘贵州省’),
(‘gdp’, ‘云南省’),
(‘gdp’, ‘西藏自治区’),
(‘gdp’, ‘陕西省’),
(‘gdp’, ‘甘肃省’),
(‘gdp’, ‘青海省’),
(‘gdp’, ‘宁夏回族自治区’),
(‘gdp’, ‘新疆维吾尔自治区’)],
names=[None, ‘省份’])

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(df5.loc['pop'])#可以通过multiindex的第一个index调用

运行结果:
2018年
省份
北京市 2154.0
天津市 1560.0
河北省 7556.0
山西省 3718.0
内蒙古自治区 2534.0
辽宁省 4359.0
吉林省 2704.0
黑龙江省 3773.0
上海市 2424.0
江苏省 8051.0
浙江省 5737.0
安徽省 6324.0
福建省 3941.0
江西省 4648.0
山东省 10047.0
河南省 9605.0
湖北省 5917.0
湖南省 6899.0
广东省 11346.0
广西壮族自治区 4926.0
海南省 934.0
重庆市 3102.0
四川省 8341.0
贵州省 3600.0
云南省 4830.0
西藏自治区 344.0
陕西省 3864.0
甘肃省 2637.0
青海省 603.0
宁夏回族自治区 688.0
新疆维吾尔自治区 2487.0

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(df5.loc['pop','北京市'])#也可以把index写全

运行结果:
2018年 2154.0
Name: (pop, 北京市), dtype: float64

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(df5.loc['pop','北京市']['2018年'])#也可以把index写全

运行结果:
2154.0

2.2 使用join函数合并表,常用于行索引相同的两个DataFrame

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
print(gdp)

运行结果:
2018年
省份
北京市 30319.98
天津市 18809.64
河北省 36010.27
山西省 16818.11
内蒙古自治区 17289.22
辽宁省 25315.35
吉林省 15074.62
黑龙江省 16361.62
上海市 32679.87
江苏省 92595.40
浙江省 56197.15
安徽省 30006.82
福建省 35804.04
江西省 21984.78
山东省 76469.67
河南省 48055.86
湖北省 39366.55
湖南省 36425.78
广东省 97277.77
广西壮族自治区 20352.51
海南省 4832.05
重庆市 20363.19
四川省 40678.13
贵州省 14806.45
云南省 17881.12
西藏自治区 1477.63
陕西省 24438.32
甘肃省 8246.07
青海省 2865.23
宁夏回族自治区 3705.18
新疆维吾尔自治区 12199.08

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
print(df6)

运行结果:
2018年_pop 2018年_gdp
省份
北京市 2154 30319.98
天津市 1560 18809.64
河北省 7556 36010.27
山西省 3718 16818.11
内蒙古自治区 2534 17289.22
辽宁省 4359 25315.35
吉林省 2704 15074.62
黑龙江省 3773 16361.62
上海市 2424 32679.87
江苏省 8051 92595.40
浙江省 5737 56197.15
安徽省 6324 30006.82
福建省 3941 35804.04
江西省 4648 21984.78
山东省 10047 76469.67
河南省 9605 48055.86
湖北省 5917 39366.55
湖南省 6899 36425.78
广东省 11346 97277.77
广西壮族自治区 4926 20352.51
海南省 934 4832.05
重庆市 3102 20363.19
四川省 8341 40678.13
贵州省 3600 14806.45
云南省 4830 17881.12
西藏自治区 344 1477.63
陕西省 3864 24438.32
甘肃省 2637 8246.07
青海省 603 2865.23
宁夏回族自治区 688 3705.18
新疆维吾尔自治区 2487 12199.08

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
print(region)

运行结果:
区域
省份
北京市 华北
天津市 华北
河北省 华北
山西省 华北
内蒙古自治区 华北
辽宁省 东北
吉林省 东北
黑龙江省 东北
上海市 华东
江苏省 华东
浙江省 华东
安徽省 华东
福建省 华东
江西省 华东
山东省 华东
河南省 中南
湖北省 中南
湖南省 中南
广东省 中南
广西壮族自治区 中南
海南省 中南
重庆市 西南
四川省 西南
贵州省 西南
云南省 西南
西藏自治区 西南
陕西省 西北
甘肃省 西北
青海省 西北
宁夏回族自治区 西北
新疆维吾尔自治区 西北

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
df7=df6.join(region) #没有重名列可以直接使用
print(df7)

运行结果:
2018年_pop 2018年_gdp 区域
省份
北京市 2154 30319.98 华北
天津市 1560 18809.64 华北
河北省 7556 36010.27 华北
山西省 3718 16818.11 华北
内蒙古自治区 2534 17289.22 华北
辽宁省 4359 25315.35 东北
吉林省 2704 15074.62 东北
黑龙江省 3773 16361.62 东北
上海市 2424 32679.87 华东
江苏省 8051 92595.40 华东
浙江省 5737 56197.15 华东
安徽省 6324 30006.82 华东
福建省 3941 35804.04 华东
江西省 4648 21984.78 华东
山东省 10047 76469.67 华东
河南省 9605 48055.86 中南
湖北省 5917 39366.55 中南
湖南省 6899 36425.78 中南
广东省 11346 97277.77 中南
广西壮族自治区 4926 20352.51 中南
海南省 934 4832.05 中南
重庆市 3102 20363.19 西南
四川省 8341 40678.13 西南
贵州省 3600 14806.45 西南
云南省 4830 17881.12 西南
西藏自治区 344 1477.63 西南
陕西省 3864 24438.32 西北
甘肃省 2637 8246.07 西北
青海省 603 2865.23 西北
宁夏回族自治区 688 3705.18 西北
新疆维吾尔自治区 2487 12199.08 西北

2.3 使用merge方法进行合并

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
df7=df6.join(region) #没有重名列可以直接使用
df8=pd.merge(pop,gdp,left_index=True,right_index=True)  #以两个dataframe的index来合并,与join相同
print(df8)

运行结果:
2018年_x 2018年_y
省份
北京市 2154 30319.98
天津市 1560 18809.64
河北省 7556 36010.27
山西省 3718 16818.11
内蒙古自治区 2534 17289.22
辽宁省 4359 25315.35
吉林省 2704 15074.62
黑龙江省 3773 16361.62
上海市 2424 32679.87
江苏省 8051 92595.40
浙江省 5737 56197.15
安徽省 6324 30006.82
福建省 3941 35804.04
江西省 4648 21984.78
山东省 10047 76469.67
河南省 9605 48055.86
湖北省 5917 39366.55
湖南省 6899 36425.78
广东省 11346 97277.77
广西壮族自治区 4926 20352.51
海南省 934 4832.05
重庆市 3102 20363.19
四川省 8341 40678.13
贵州省 3600 14806.45
云南省 4830 17881.12
西藏自治区 344 1477.63
陕西省 3864 24438.32
甘肃省 2637 8246.07
青海省 603 2865.23
宁夏回族自治区 688 3705.18
新疆维吾尔自治区 2487 12199.08

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
df7=df6.join(region) #没有重名列可以直接使用
df8=pd.merge(pop,gdp,left_index=True,right_index=True)  #以两个dataframe的index来合并,与join相同
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population')
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP')
#重新读入pop和gdp,并把省份名称纳入dataframe中
print(pop)

运行结果:
省份 2018年
0 北京市 2154
1 天津市 1560
2 河北省 7556
3 山西省 3718
4 内蒙古自治区 2534
5 辽宁省 4359
6 吉林省 2704
7 黑龙江省 3773
8 上海市 2424
9 江苏省 8051
10 浙江省 5737
11 安徽省 6324
12 福建省 3941
13 江西省 4648
14 山东省 10047
15 河南省 9605
16 湖北省 5917
17 湖南省 6899
18 广东省 11346
19 广西壮族自治区 4926
20 海南省 934
21 重庆市 3102
22 四川省 8341
23 贵州省 3600
24 云南省 4830
25 西藏自治区 344
26 陕西省 3864
27 甘肃省 2637
28 青海省 603
29 宁夏回族自治区 688
30 新疆维吾尔自治区 2487

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
df7=df6.join(region) #没有重名列可以直接使用
df8=pd.merge(pop,gdp,left_index=True,right_index=True)  #以两个dataframe的index来合并,与join相同
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population')
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP')
#重新读入pop和gdp,并把省份名称纳入dataframe中
pop['数据']='pop'
gdp['数据']='gdp'
print(gdp)

运行结果:
省份 2018年 数据
0 北京市 30319.98 gdp
1 天津市 18809.64 gdp
2 河北省 36010.27 gdp
3 山西省 16818.11 gdp
4 内蒙古自治区 17289.22 gdp
5 辽宁省 25315.35 gdp
6 吉林省 15074.62 gdp
7 黑龙江省 16361.62 gdp
8 上海市 32679.87 gdp
9 江苏省 92595.40 gdp
10 浙江省 56197.15 gdp
11 安徽省 30006.82 gdp
12 福建省 35804.04 gdp
13 江西省 21984.78 gdp
14 山东省 76469.67 gdp
15 河南省 48055.86 gdp
16 湖北省 39366.55 gdp
17 湖南省 36425.78 gdp
18 广东省 97277.77 gdp
19 广西壮族自治区 20352.51 gdp
20 海南省 4832.05 gdp
21 重庆市 20363.19 gdp
22 四川省 40678.13 gdp
23 贵州省 14806.45 gdp
24 云南省 17881.12 gdp
25 西藏自治区 1477.63 gdp
26 陕西省 24438.32 gdp
27 甘肃省 8246.07 gdp
28 青海省 2865.23 gdp
29 宁夏回族自治区 3705.18 gdp
30 新疆维吾尔自治区 12199.08 gdp

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  #针对坐标轴中负号显示不出来的问题
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population',index_col=0)
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP',index_col=0)
df5=pd.concat([pop,gdp],axis=0,keys=['pop','gdp'])  #不用改名字即可合并
df6=pop.join(gdp,lsuffix='_pop', rsuffix='_gdp') #两个dataframe列名相同,需要加lsuffix或rsuffix在左边/右边的列名上加后缀来区分
region=pd.read_excel('GDPandPopulation.xlsx',sheet_name='region',index_col=0)
df7=df6.join(region) #没有重名列可以直接使用
df8=pd.merge(pop,gdp,left_index=True,right_index=True)  #以两个dataframe的index来合并,与join相同
pop=pd.read_excel('GDPandPopulation.xlsx',sheet_name='Population')
gdp=pd.read_excel('GDPandPopulation.xlsx',sheet_name='GDP')
#重新读入pop和gdp,并把省份名称纳入dataframe中
pop['数据']='pop'
gdp['数据']='gdp'
df9=pd.merge(pop,gdp,how='outer',on=['省份','2018年'])
#how='outer'表示求两个dataframe的并集,on=[列名]表示合并依照的列,即保持列名不变的列
print(df9)

运行结果:
省份 2018年 数据_x 数据_y
0 北京市 2154.00 pop NaN
1 天津市 1560.00 pop NaN
2 河北省 7556.00 pop NaN
3 山西省 3718.00 pop NaN
4 内蒙古自治区 2534.00 pop NaN
.. … … … …

57 陕西省 24438.32 NaN gdp
58 甘肃省 8246.07 NaN gdp
59 青海省 2865.23 NaN gdp
60 宁夏回族自治区 3705.18 NaN gdp
61 新疆维吾尔自治区 12199.08 NaN gdp
[62 rows x 4 columns]

以上就是《Pandas统计分析基础(5):DataFrame的合并》,如果有改进的建议,欢迎在评论区留言交流~
持续更新中……原创不易,各位看官请随手点下Follow和Star,感谢!!!

Original: https://blog.csdn.net/l1796333514/article/details/123651411
Author: Xlong~
Title: Pandas统计分析基础(5):DataFrame的合并(内含大量代码可供练习)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678405/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球