Python使用for循环合并Pandas DataFrame时出现数据丢失问题如何修复
问题原因
你的代码出错核心是循环内的合并逻辑错误:每次迭代都仅将初始的df1和当前生成的df2做合并,直接覆盖df变量,之前迭代得到的合并结果完全没有被留存,最终df仅会包含data1第一行、最后一行展开的内容,中间所有行的信息全部丢失。
修复方案
更推荐第一种写法,性能更高:
方案1:先收集所有子DataFrame再统一合并
循环中反复调用pd.concat会生成大量中间对象,性能较差,先把所有子DataFrame存入列表,最后合并一次的写法效率更高,尤其适合data1行数较多的场景:
import pandas as pd start_date = '2020-12-13' # 初始化空列表存储所有展开后的子DataFrame df_list = [] for i in range(len(data1)): tmp_df = pd.DataFrame({ 'id': data1.id[i], 'Statut': data1.statut[i], 'Date send': data1.date_send[i], 'Day': pd.date_range(start_date, periods=len(data1.binairy[i]), freq='D'), 'Code': list(data1.binairy[i]), 'Commentaire ': data1.commentaire[i] }) df_list.append(tmp_df) # 一次性合并所有子DataFrame df = pd.concat(df_list, ignore_index=True) df
方案2:沿用原有写法调整合并逻辑
如果要保留你原来的代码结构,只需把初始df1赋值给df,每次循环都将已有的df和新生成的df2合并即可:
import pandas as pd start_date = '2020-12-13' # 初始化df为第一行data1展开的结果 df = pd.DataFrame({ 'id':data1.id[0], 'Statut':data1.statut[0], 'Date send': data1.date_send[0], 'Day': pd.date_range(start_date, periods=len(data1.binairy[0]), freq='D'), 'Code': list(data1.binairy[0]), 'Commentaire ':data1.commentaire[0] }) for i in range(1, len(data1)): df2 = pd.DataFrame({ 'id':data1.id[i], 'Statut':data1.statut[i], 'Date send': data1.date_send[i], 'Day': pd.date_range(start_date, periods=len(data1.binairy[i]), freq='D'), 'Code': list(data1.binairy[i]), 'Commentaire ':data1.commentaire[i] }) # 合并当前已有的全部数据和新生成的df2 df = pd.concat([df, df2], ignore_index=True) df
内容的提问来源于stack exchange,提问作者Cherry cherry
相关产品推荐
相关产品推荐

