从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
相关产品推荐
相关产品推荐

