You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Pandas DataFrame提取间隔值写入另一DataFrame遇NaN问题求助

解决Pandas新列全NaN的问题

常见原因及对应解法

1. 提取逻辑错误(按索引而非位置切片)

如果你的提取代码是按DataFrame的索引切片(比如df1['指定列'][::10]),当df1的索引不是连续整数时,会按索引步长10取值,而非实际行位置的每隔10行,导致提取的值不符合预期,甚至长度不匹配。

正确提取方式:用iloc按行位置切片,确保取的是每隔10行的实际数据:

# 从df1的指定列中,按行位置每隔10行提取值(从第0行开始)
extracted_list = df1['指定列'].iloc[::10].tolist()

2. 行号/长度不匹配

如果提取的列表长度和df2的行数不一致,直接赋值会导致长度不足的部分填充NaN;或者df2的索引不是连续整数,按列表位置赋值时索引无法对齐。

解法:

  • 先确认列表长度和df2行数一致:
    # 若df2有N行,确保从df1中提取N个每隔10行的值
    extracted_list = [df1['指定列'].iloc[i*10] for i in range(len(df2))]
    
  • 重置df2的索引为连续整数,避免索引对齐问题:
    df2 = df2.reset_index(drop=True)
    df2['新列名'] = extracted_list
    

3. 直接赋值Series导致索引不匹配

如果直接将提取的Series赋值给df2的新列,而两者索引无交集,会全量填充NaN。

正确做法:将提取的Series重置索引后再赋值,或者转成列表按位置赋值:

# 方式1:转列表赋值
df2['新列名'] = df1['指定列'].iloc[::10].tolist()

# 方式2:重置Series索引后赋值
df2['新列名'] = df1['指定列'].iloc[::10].reset_index(drop=True)

完整示例代码

import pandas as pd

# 模拟测试数据
df1 = pd.DataFrame({'指定列': range(100)})  # 100行数据
df2 = pd.DataFrame({'其他列': range(10)})  # 10行数据,对应df1的0,10,...,90行

# 提取每隔10行的值
extracted_list = df1['指定列'].iloc[::10].tolist()

# 重置df2索引并赋值
df2 = df2.reset_index(drop=True)
df2['新列'] = extracted_list

print(df2)

内容的提问来源于stack exchange,提问作者PythonLover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:25:08