Python包含空df,但列包含元素

Python包含空df,但列包含元素,python,pandas,export-to-csv,export-to-excel,Python,Pandas,Export To Csv,Export To Excel,我的剧本里有一件很烦人的事,我不知道出了什么问题。当我尝试过滤我的数据框,然后将要导出到excel的行添加到新的数据框时,就会发生这种情况 文件导出为空DF,print也向我显示“report”是空的,但当我尝试打印report.Name、report.Value等时,我得到了正常和正确的元素输出。此外,我只能将一列导出到excel,而不是整个DF,看起来是空的。。。。是什么导致了那场奇怪的事故 这是我的剧本: df = pd.read_excel('testfile2.xlsx') repor

我的剧本里有一件很烦人的事,我不知道出了什么问题。当我尝试过滤我的数据框,然后将要导出到excel的行添加到新的数据框时,就会发生这种情况

文件导出为空DF,print也向我显示“report”是空的,但当我尝试打印report.Name、report.Value等时,我得到了正常和正确的元素输出。此外,我只能将一列导出到excel,而不是整个DF,看起来是空的。。。。是什么导致了那场奇怪的事故

这是我的剧本:

df = pd.read_excel('testfile2.xlsx')
report = pd.DataFrame(columns=['Type','Name','Value'])

for index, row in df.iterrows():
    if type(row[0]) == str:
        type_name = row[0].split(" ")
        if type_name[0] == 'const':
            selected_index = index
            report['Type'].loc[index] = type_name[1]
            report['Name'].loc[index] = type_name[2]
            report['Value'].loc[index] = row[1]

        else:
            for elements in type_name:
                report['Value'].loc[selected_index] += " " + elements

    elif type(row[0]) == float:
        df = df.drop(index=index)

print(report) #output - Empty DataFrame
print(report.Name) output - over 500 elements

您试图操纵一个不存在的序列,从而导致所描述的行为

通过一个更简单的例子,我得到了同样的结果:

report = pd.DataFrame(columns=['Type','Name','Value'])
report['Type'].loc[0] = "A"
report['Name'].loc[0] = "B"
report['Value'].loc[0] = "C"

print(report) #empty df
print(report.Name) # prints "B" in a series
简单的解决方案:只需添加整行,而不是三个单独的值:

report = pd.DataFrame(columns=['Type','Name','Value'])
report.loc[0] = ["A", "B", "C"]
或者在您的代码中:

report.loc[index] = [type_name[1], type_name[2], row[1]]
如果您希望以与当前相同的方式执行此操作,则首先需要将具有给定索引的空序列添加到数据帧中,然后才能对其进行操作:

report.loc[index] = pd.Series([])
report['Type'].loc[index] = type_name[1]
report['Name'].loc[index] = type_name[2]
report['Value'].loc[index] = row[1]

您试图操纵一个不存在的序列,从而导致所描述的行为

通过一个更简单的例子,我得到了同样的结果:

report = pd.DataFrame(columns=['Type','Name','Value'])
report['Type'].loc[0] = "A"
report['Name'].loc[0] = "B"
report['Value'].loc[0] = "C"

print(report) #empty df
print(report.Name) # prints "B" in a series
简单的解决方案:只需添加整行,而不是三个单独的值:

report = pd.DataFrame(columns=['Type','Name','Value'])
report.loc[0] = ["A", "B", "C"]
或者在您的代码中:

report.loc[index] = [type_name[1], type_name[2], row[1]]
如果您希望以与当前相同的方式执行此操作,则首先需要将具有给定索引的空序列添加到数据帧中,然后才能对其进行操作:

report.loc[index] = pd.Series([])
report['Type'].loc[index] = type_name[1]
report['Name'].loc[index] = type_name[2]
report['Value'].loc[index] = row[1]

你的出口声明在哪里?将报告写入excel('name.xlsx',index=False)您的出口声明在哪里?将报告写入excel('name.xlsx',index=False)