Python pandas 空 df 但列有元素
Python pandas empty df but columns has elements
我的脚本中确实有令人恼火的地方,我不知道哪里出了问题。当我尝试过滤我的数据框然后将行添加到我想要导出到 excel 的 newone 时,就会发生这种情况。
文件导出为空 DF,同时打印显示 "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]]
如果你想以与现在相同的方式进行操作,你首先需要在你的 DataFrame 中添加一个具有给定索引的空序列,然后才能对其进行操作:
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 的 newone 时,就会发生这种情况。
文件导出为空 DF,同时打印显示 "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]]
如果你想以与现在相同的方式进行操作,你首先需要在你的 DataFrame 中添加一个具有给定索引的空序列,然后才能对其进行操作:
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]