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的合并(内含大量代码可供练习)_第1张图片

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,感谢!!!

你可能感兴趣的:(Python大数据分析,python,pycharm,数据分析,pandas,DataFrame)