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