python实现表格外连接

1需求描述

在一次数据处理中,需要将900个表格合并成一个表格。每个表格只有两行,第一行是列名(表头header),第二行是每一列对应的值。这些表格的列的个数和列名都不完全一致,最终的结果表格的列(表头)应当包含所有表格的列的总和,且不能重复,相当于并集最终的结果表格的每一行由这900个表格的内容组成,故除表头外,应当有900行。有的表格不一定含有结果表的某一列(表头不一致决定的),那么就取空值(null)。

2实现思路

2.1pd.merge()

根据需求,这是对多张表进行外连接操作。python常用的表格处理库pandas,有一个合并函数可以实现外连接

df_pri=pd.read_csv('C:/Users/38266/Desktop/t/csvFile/0.csv',dtype='str')
for i in range(1,900):
    df=pd.read_csv('C:/Users/38266/Desktop/t/csvFile/'+str(i)+'.csv',dtype='str')
    #df_pri df为要合并的两张表 
	#how指合并方式
    df_pri = pd.merge(df_pri, df, how='outer')
    dir_pri=df_pri.to_dict()
    print(df_pri)
    

但是,合并结果漏了一些表。合并代码只有一行,也不好调试,必须去了解它的底层逻辑。避免麻烦,自己实现了一个表格外连接操作的函数。

2.2手动实现

第一步,获得结果表的表头(确定列名)。

def get_headers():
    '''
    # 获得结果表的表头
    :return: 返回类型为dict,key为表头名,value为数组存储对应列的内容,此时value为空列表[]
    '''
    #set集合会自动剔除相同的元素
    hders = set()
    for i in range(0, 900):
        single_df = pd.read_csv('C:/Users/38266/Desktop/t/csvFile/' + str(i) + '.csv', dtype='str')
        #将读取的csv文件转换为字典类型,key为表头名(列名),value为对应的每一列的内容。
        single_dic = single_df.to_dict()
        for k in single_dic.keys():
            hders.add(k)
    print("表头:%s" % hders)
    return hders

第二步,给每一个列添加对应的内容。

思想:将每一个待合并的表格转换为字典类型(dict),提取出key,value,根据key一致添加到表头字典对应的key的value列表中。检查这个表格的表头和结果表头的差异,将没有添加数据的列设置为null。以此循环900次。

def my_merge(head):
    
    # head:总表表头,dict
    # 总标头hders即为字典的键
    # res_df=pd.DataFrame(columns=hders)
    for i in range(0,900):
        single_df=pd.read_csv('C:/Users/38266/Desktop/t/csvFile/'+str(i)+'.csv',dtype='str')
        single_dic=single_df.to_dict()
        existed_k=[]#记录对结果表头的哪些键添加了数据
        for k,v in single_dic.items():
            existed_k.append(k)
            head[k].append(v[0])
        #找出没有添加数据的列
        #方法:集合求差
        none_k=list(set(head.keys()).difference(set(existed_k)))  # head.keys()-existed_kv
        #遍历结果表头,如果有项目存在于none_k,就设置值“None”
        for k in head.keys():
            if none_k.__contains__(k):
                head[k].append("None")
    res_df=pd.DataFrame(head)
    res_df.to_excel('C:/Users/38266/Desktop/t/merge1.xlsx', sheet_name='info_data')
    print('OK')

3小结

python现成的库固然好用,可以几行代码甚至一行代码实现很多功能,但是也是坏处。一旦出了问题,都没法调。这时候自己实现还更好用。实际上,这些库、函数的底层还是封装了大量的逻辑代码,学习时自己多进行底层的实现,有利于编程思维的养成和对算法理解,毕竟编程不是碉堡

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值