如何向Pandas DataFrame添加不同长度列并保留所有数据?
解决Pandas添加不同长度列时的数据截断问题
当你直接向空DataFrame赋值添加列时,后续列的长度如果超过已存在列的长度,超出部分会被截断。要保留所有列的完整数据,不要直接赋值列,而是用pd.concat()将每个Series合并成DataFrame——它会自动按索引对齐,长度不足的位置填充NaN,不管添加顺序如何,都能保留所有数据。
原问题示例(首列较短导致后续列截断)
import pandas as pd df_profile = pd.DataFrame() df_profile['A'] = pd.Series([1,2,3,4]) df_profile['B'] = pd.Series([10,20,30,40,50,60]) print(df_profile)
输出:
A B 0 1 10 1 2 20 2 3 30 3 4 40
可以看到Series B的后两个值(50、60)被截断了。
改进方案:使用pd.concat合并
不管列的添加顺序如何,把每个Series转为单独的DataFrame,再用pd.concat()按列合并:
import pandas as pd # 定义所有要添加的列 series_dict = { 'A': pd.Series([1,2,3,4]), 'B': pd.Series([10,20,30,40,50,60]) } # 合并成DataFrame df_profile = pd.concat(series_dict, axis=1) print(df_profile)
输出:
A B 0 1.0 10.0 1 2.0 20.0 2 3.0 30.0 3 4.0 40.0 4 NaN 50.0 5 NaN 60.0
这样A列不足的位置补NaN,B列的所有数据都被保留了。
循环添加场景的适配
如果是循环动态添加列,可以先把每个Series存入字典,最后一次性合并;或者每次合并一个新列:
import pandas as pd df_profile = pd.DataFrame() # 模拟循环添加不同长度的列 columns_to_add = [ ('A', [1,2,3,4]), ('B', [10,20,30,40,50,60]), ('C', [100,200]) ] for col_name, data in columns_to_add: # 每次将新Series转为DataFrame,和原DataFrame合并 df_profile = pd.concat([df_profile, pd.Series(data, name=col_name)], axis=1) print(df_profile)
输出:
A B C 0 1.0 10.0 100.0 1 2.0 20.0 200.0 2 3.0 30.0 NaN 3 4.0 40.0 NaN 4 NaN 50.0 NaN 5 NaN 60.0 NaN
所有列的完整数据都被保留,不足的位置自动填充NaN。
内容的提问来源于stack exchange,提问作者roudan
相关产品推荐
相关产品推荐

