将多数组赋值给DataFrame列时遇长度不匹配问题求助
解决DataFrame整列批量赋值单个ID的问题
你遇到的system_id列被填充为NaN的情况,大概率是因为a_id[index]的类型不是单个标量值,而是长度为1的数组(比如numpy数组),导致pandas没法自动把它广播到整个列。不过不管a_id的类型是什么,我们都有简单可靠的办法搞定这个问题,同时还能优化你的代码。
修正后的核心代码方案
首先你已经处理好了date列的长度匹配(temp = pd.date_range(date_from, date_to)[:len(pr_daily)]),接下来只需要调整system_id的赋值方式:
方案1:直接赋值标量(最简洁)
如果a_id是普通列表(比如a_id = [1001]),直接取单个元素赋值就行,pandas会自动把这个值广播到列的所有行:
temp = pd.date_range(date_from, date_to)[:len(pr_daily)] finalDataframes = [] for index in range(len(a_id)): df = pd.DataFrame() df['date'] = temp # 直接赋值单个标量,自动填充所有行 df['system_id'] = a_id[index] df['simulated_yield_in_kWh'] = pr_daily[:, index] df['gloabl_irradiance_tilted_in_kWh_per_m2'] = rad_daily[:, index] finalDataframes.append(df)
方案2:处理numpy数组类型的a_id
如果a_id是numpy数组(比如a_id = np.array([1001])),需要把元素转成标量,用.item()方法:
df['system_id'] = a_id[index].item()
方案3:手动生成匹配长度的序列(最稳妥)
不管a_id是什么类型,都可以手动生成和temp长度一致的列表,确保完全匹配:
df['system_id'] = [a_id[index]] * len(temp) # 或者用pandas的Series df['system_id'] = pd.Series([a_id[index]] * len(temp))
额外优化:简化代码(因为a_id长度为1)
既然a_id的长度是1,完全不需要循环,直接写更简洁:
temp = pd.date_range(date_from, date_to)[:len(pr_daily)] df = pd.DataFrame({ 'date': temp, 'system_id': a_id[0], # 若为numpy数组则用a_id[0].item() 'simulated_yield_in_kWh': pr_daily[:, 0], 'gloabl_irradiance_tilted_in_kWh_per_m2': rad_daily[:, 0] }) finalDataframes.append(df)
为什么之前会出现NaN?
当你给DataFrame列赋值一个长度为1的数组(比如numpy的array([1001]))时,pandas会把它当作长度为1的序列,和目标列的342行长度不匹配,无法对齐,最终就会填充为NaN。而如果赋值的是单个标量(比如整数1001),pandas会自动将这个值广播到每一行,完美匹配长度。
内容的提问来源于stack exchange,提问作者Timo K
相关产品推荐
相关产品推荐

