pandas表合并——按指定列合并两个表里同样名称的行

在处理观测站气象数据时,遇到了需要将两个表的数据整理到一起的问题,两个表的数据结构如下:
pandas表合并——按指定列合并两个表里同样名称的行_第1张图片
pandas表合并——按指定列合并两个表里同样名称的行_第2张图片
现在需要将两个表按第一列‘Sta_ID’拼接,将第二个表中‘Sta_ID’值与第一个表相同的行拼接到同一行,效果如下:
pandas表合并——按指定列合并两个表里同样名称的行_第3张图片
需要的库基本有pandas,xlrd,xlwt这几个,首先使用pandas.read_excel()将数据分别读入pandas。

A = pd.read_excel('E:\\MODIS\\MCD19A2\\AOD_Max.xls', sheet_name='AOD_Max') # 读取 excel
B = pd.read_excel('E:\\MODIS\\MCD19A2\\AOD_Max.xls', sheet_name='Station_Max', index_col=0)

pandas表合并——按指定列合并两个表里同样名称的行_第4张图片
pandas表合并——按指定列合并两个表里同样名称的行_第5张图片

下一步进行合并,使用pandas.concat()函数实现,关于concat()函数具体的解释可以参考:

https://blog.csdn.net/mr_hhh/article/details/79488445

但是这里有个问题,需要设置索引列为‘Sta_ID’这一列,如果默认索引为这一列,由于该列有重复项,在执行concat()函数时会报错
InvalidIndexError: Reindexing only valid with uniquely valued Index objects’
为解决这个问题,将表A读入时采用默认索引,然后用drop_duplicates()函数删掉重复的行。注意:我的数据B表没有重复项要去除,所以读的时候直接默认索引列为‘Sta_ID’了。

X = A.drop_duplicates(subset=['Sta_ID'])

这里我在测试的时候发现,如果把返回值还给A(如A.drop_duplicates(subset=['Sta_ID'])A=A.drop_duplicates(subset=['Sta_ID'])),那A是没有变化的,所以把这个值给了X,就可以实现了。
pandas表合并——按指定列合并两个表里同样名称的行_第6张图片

drop_duplicates()函数参考

https://blog.csdn.net/Disany/article/details/82689948

现在需要把删除重复项的表X的索引列改为‘Sta_ID’列:

X = X.set_index('Sta_ID')

pandas表合并——按指定列合并两个表里同样名称的行_第7张图片
最后完成拼接:

merge = pd.concat([X, B], axis=1, join='inner') 

完整程序如下:

import pandas as pd
# 从excel导入表
A = pd.read_excel('E:\\MODIS\\MCD19A2\\AOD_Max.xls', sheet_name='AOD_Max') # 读取 excel
B = pd.read_excel('E:\\MODIS\\MCD19A2\\AOD_Max.xls', sheet_name='Station_Max', index_col=0)
# 去除重复行
X = A.drop_duplicates(subset=['Sta_ID'])
# 更换索引列
X = X.set_index('Sta_ID')
# 按索引列合并
merge = pd.concat([X, B], axis=1, join='inner') 
print(merge)
# pandas表存出
writer = pd.ExcelWriter('E:\\MODIS\\MCD19A2\\AOD_Sta.xls')
merge.to_excel(writer,float_format='%.5f')
writer.save()

pandas表合并——按指定列合并两个表里同样名称的行_第8张图片

你可能感兴趣的:(python,开发语言,excel)