Python 创建数据帧时出错“***”ValueError:如果使用所有标量值,则必须传递一个索引";

Python 创建数据帧时出错“***”ValueError:如果使用所有标量值,则必须传递一个索引";,python,pandas,dataframe,Python,Pandas,Dataframe,我试图用seaborn创作一个情节,但我遇到了一个错误: *** ValueError: If using all scalar values, you must pass an index 在我的程序中,我从XFOIL读取了一个输出文件,并试图绘制其结果以进行检查 XFOIL文件格式: # x Cp 1.00000 0.24276 0.99818 0.23883 0.99591 0.22657 0.99

我试图用seaborn创作一个情节,但我遇到了一个错误:

*** ValueError: If using all scalar values, you must pass an index
在我的程序中,我从XFOIL读取了一个输出文件,并试图绘制其结果以进行检查

XFOIL文件格式:

#      x          Cp  
     1.00000    0.24276
     0.99818    0.23883
     0.99591    0.22657
     0.99342    0.21421
     0.99066    0.20128
     0.98759    0.18802
     0.98413    0.17434
     0.98020    0.16018
     0.97569    0.14544
     0.97044    0.12999
     0.96429    0.11374
     0.95703    0.09661
### **(the file is big, and I will not transcript it completely here)** ###
我决定创建一个数据框,以便轻松地进行绘图过程

lst = fl.readlines()
lst_splt = [ s.replace('#','').split() for s in lst] 
cp = pd.DataFrame.from_records(lst_splt[1:], columns=lst_splt[:1]).astype(float)
最后我试着用seaborn来描绘它:

sns.lineplot(x='x',y='Cp', data=cp)
但正如我在问题开头所说,出现了一个错误:

*** ValueError: If using all scalar values, you must pass an index
如何修复此错误?

不确定为什么会出现此错误,但您可以简单地执行以下操作:

导入matplotlib.pyplot作为plt
plt.绘图(cp[“x”],cp[“cp”])
plt.show()
编辑:经过一些实验后,您创建数据帧的方法似乎是罪魁祸首。您可以将其替换为:

cp=pd.read\u csv(文件名,sep=“\s+”,skiprows=2,name=[“x”,“cp”])
#确保skiprows的值正确(应忽略标题,仅此而已)
#那么这就行了:
sns.lineplot(x=“x”,y=“Cp”,data=Cp)
不确定为什么会出现此错误,但您可以简单地执行以下操作:

导入matplotlib.pyplot作为plt
plt.绘图(cp[“x”],cp[“cp”])
plt.show()
编辑:经过一些实验后,您创建数据帧的方法似乎是罪魁祸首。您可以将其替换为:

cp=pd.read\u csv(文件名,sep=“\s+”,skiprows=2,name=[“x”,“cp”])
#确保skiprows的值正确(应忽略标题,仅此而已)
#那么这就行了:
sns.lineplot(x=“x”,y=“Cp”,data=Cp)

问题与传递给
DataFrame
构造函数的
columns
参数有关

打印
lst\u splt[:1]
时,这是传递给
参数的值,我得到以下结果:

print(lst_splt[:1])
# [['x', 'Cp']]
在本例中,
Dataframe
构造函数需要一个平面列表,而不是嵌套列表。当您将
lst\u splt[:1]
更改为
lst\u splt[:1][0]
时,问题就解决了,打印时当然会给出:

print(lst_splt[:1][0])
# ['x', 'Cp']
下面代码的修改版本工作正常:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

fl = open('data.txt', 'r')

lst = fl.readlines()
lst_splt = [ s.replace('#','').split() for s in lst]
cp = pd.DataFrame.from_records(lst_splt[1:], columns=lst_splt[:1][0]).astype(float)

sns.lineplot(data=cp, x='x',y='Cp')

plt.show()
输出:

问题与传递给
DataFrame
构造函数的
columns
参数有关

打印
lst\u splt[:1]
时,这是传递给
参数的值,我得到以下结果:

print(lst_splt[:1])
# [['x', 'Cp']]
在本例中,
Dataframe
构造函数需要一个平面列表,而不是嵌套列表。当您将
lst\u splt[:1]
更改为
lst\u splt[:1][0]
时,问题就解决了,打印时当然会给出:

print(lst_splt[:1][0])
# ['x', 'Cp']
下面代码的修改版本工作正常:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

fl = open('data.txt', 'r')

lst = fl.readlines()
lst_splt = [ s.replace('#','').split() for s in lst]
cp = pd.DataFrame.from_records(lst_splt[1:], columns=lst_splt[:1][0]).astype(float)

sns.lineplot(data=cp, x='x',y='Cp')

plt.show()
输出:

能否尝试将索引=[0]添加到参数数据框中。从_记录(数据,索引=[0])?我无法复制您的场景,但这在以前对我有效。您是否尝试检查数据帧是否与您期望的一样?是吗?您是否尝试检查(例如,通过阅读文档)Seaborn是否希望数据以这种方式排列?尝试复制和粘贴
时发生了什么情况?如果使用所有标量值,则必须传递一个索引
?是否确定错误出现在
sns.lineplot
上,而不是出现在外观异常的
pd.DataFrame.from\u记录上。您能在数据帧创建之后打印出
cp.head()
吗?使用
cp=pd.read\u csv(flname,'r',sep='\s+',skiprows=(3),header=None,index=[0])
错误
***类型错误:read\u csv()在读取cp时参数'sep'有多个值。我没有“t通过此修改成功访问了
sns.lineplot
。您是否可以尝试将索引=[0]添加到参数数据框中。从_记录(数据,索引=[0])?我无法复制您的场景,但这在以前对我有效。您是否尝试检查数据帧是否与您期望的一样?是吗?您是否尝试检查(例如,通过阅读文档)Seaborn是否希望数据以这种方式排列?尝试复制和粘贴
时发生了什么情况?如果使用所有标量值,则必须传递一个索引
?是否确定错误出现在
sns.lineplot
上,而不是出现在外观异常的
pd.DataFrame.from\u记录上。您能在数据帧创建之后打印出
cp.head()
吗?使用
cp=pd.read\u csv(flname,'r',sep='\s+',skiprows=(3),header=None,index=[0])
错误
***类型错误:read\u csv()在读取cp时参数'sep'有多个值。我没有“通过此修改,t成功访问了
sns.lineplot
。我觉得这并没有回答OP的特定问题,即如何处理他的XFOIL文件格式。使用您介绍的第一种方法可以正常工作。我以前已经试过了。但我仍然对这个错误感到好奇。我用seaborn做了类似的尝试,但错误依然存在。是的,您是否尝试过用我在帖子中提到的函数
pd.read\u csv
替换文件打开>读入数据帧?这应该适用于您的文件格式,并提供您想要的结果。在第二个过程中,我尝试了,它成功了!谢谢!删除“r”(第二个参数),它没有位置……在我看来,这并没有回答OP特定的问题,即处理他的XFOIL文件格式。使用您介绍的第一种方法可以正常工作。我以前已经试过了。但我仍然对这个错误感到好奇。我用seaborn做了类似的尝试,但错误依然存在。是的,您是否尝试过用我在帖子中提到的函数
pd.read\u csv
替换文件打开>读入数据帧?这应该适用于您的文件格式,并提供您想要的结果。在第二个过程中,我尝试了,它成功了!谢谢!删除“r”(第二个参数),它没有位置…我喜欢你提出的方法!谢谢!它也会在其他一些问题上帮助我!我喜欢你的方法