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

基于DataFrame索引填充空列异常:为何所有行均显示False?

问题

尝试为DataFrame(df3)添加名为Information的列,要求行索引为0时填充字符串'True',其余行填充'False',但运行后所有行(包括索引为0的行)都被填充为'False',具体代码及输出如下:

输入代码

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Column1': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
                    'Column2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                    'Column3': ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'],
                    'Column4': ['K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'],
                    'Column5': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
                    'Column6': ['XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX'],
                    'Column7': ['U', 'V', 'W', 'X', 'Y', 'Z', '', '', '', ''],
                    'Column8': [21, 22, 23, 24, 25, 26, pd.NA, pd.NA, pd.NA, pd.NA],
                    'Column9': ['XXI', 'XXII', 'XXIII', 'XXIV', 'XXV', 'XXVI', '', '', '', '']})

column_names = ['Letters', 'Numbers', 'RomanNumerals']
df3 = pd.DataFrame(columns = column_names)

i=0
while i<len(df1.columns):
    df2 = df1.iloc[:, i:i+3]
    df2.columns = column_names
    df3 = pd.concat([df3, df2])
    i+=3

df3.dropna(inplace=True)

for index, row in df3.iterrows():
    df3['Information'] = np.where(index == 0, True,  False)

display(df3)

输出结果

LettersNumbersRomanNumeralsInformation
0A1IFALSE
1B2IIFALSE
2C3IIIFALSE
3D4IVFALSE
4E5VFALSE
5F6VIFALSE
6G7VIIFALSE
7H8VIIIFALSE
8I9IXFALSE
9J10XFALSE
0K11XIFALSE
1L12XIIFALSE
2M13XIIIFALSE
3N14XIVFALSE
4O15XVFALSE
5P16XVIFALSE
6Q17XVIIFALSE
7R18XVIIIFALSE
8S19XIXFALSE
9T20XXFALSE
0U21XXIFALSE
1V22XXIIFALSE
2W23XXIIIFALSE
3X24XXIVFALSE
4Y25XXVFALSE
5Z26XXVIFALSE
原因分析

你的循环逻辑存在根本性错误:

  • 循环中执行df3['Information'] = np.where(index == 0, True, False)时,并非给当前行赋值,而是覆盖整个Information列。
  • 循环会遍历df3的每一行,最后一次循环的index是5(最后一行的索引),此时index == 0为False,所以整个列会被最终的np.where结果覆盖,全部变成False。
  • 另外,np.where的第一个参数是单个布尔值(不是对应每行的条件数组),所以会生成一个全为相同值的数组,直接替换整列。
解决方案

方法1:向量式操作(推荐,符合Pandas最佳实践)

直接利用索引条件一次性生成整列,无需循环,效率最高:

# 生成布尔值列
df3['Information'] = df3.index == 0
# 如果需要字符串类型的'True'/'False',转换即可:
df3['Information'] = (df3.index == 0).astype(str)

方法2:正确的循环赋值(不推荐,仅作演示)

如果一定要用循环,需要给当前行的指定列赋值,而非整列:

# 先默认填充所有行为'False'
df3['Information'] = 'False'
for index, row in df3.iterrows():
    if index == 0:
        # 定位到当前行的Information列赋值
        df3.loc[index, 'Information'] = 'True'

注意:这种行遍历循环在数据量大时效率极低,Pandas官方不推荐使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:09:24