Bokeh:属性错误:'DataFrame'对象没有'tolist'属性。

23

我是pandas和bokeh的新手,我正在尝试从pandas dataframe创建散点图。然而,我一直得到以下错误:

new_data[colname] = df[colname].tolist()
AttributeError: 'DataFrame' object has no attribute 'tolist' 

使用 bokeh 提供的虚拟数据(从 bokeh.sampledata.iris 导入 flowers as data)时,散点图可以正常运行。

   type   tsneX      tsneY      +50.000 columns
0  A      53.828863  20.740931  
1  B      57.816909  18.478468  
2  A      55.913429  22.948167  
3  C      56.603005  15.738954 


scatter = Scatter(df, x='tsneX', y='tsneY',
                  color='type', marker='type',
                  title='t-sne',
                  legend=True)

编辑: 我没有使用tolist(),但Bokeh的Scatter()使用了它并产生了下面的错误。


你能否提供一下你的数据样本,例如:print(new_data.head(5)) 并解释一下你的 XY 列是什么? - MaxU - stand with Ukraine
它有超过50,000列,所以这并不容易做到。然而,我通过执行df = df.loc[:, ('type', 'tsneX', 'tsneY')]使其正常工作。我不知道这如何解决问题,但它有效。 - Jab
1
不清楚 - Bokeh 的问题是什么? - MaxU - stand with Ukraine
AttributeError: 'DataFrame'对象没有'tolist'属性,这是Scatter()的结果,所以我认为这是一个Bokeh问题。然而,通过删除冗余列可以解决该问题。 - Jab
2个回答

35

您在错误地使用tolist。您需要使用.values后跟tolist()

  type   tsneX      tsneY  
0  A      53.828863  20.740931  
1  B      57.816909  18.478468  
2  A      55.913429  22.948167  
3  C      56.603005  15.738954 

对于上述数据框,要将X和Y值作为列表获取,可以执行以下操作:

tsneY_data = df['tsneY'].values.tolist()
>> [20.740931, 18.478468, 22.948167, 15.7389541]

tsneX_data = df['tsneX'].values.tolist()
>> [53.828863, 57.816909, 55.913429, 56.603005]

如果您想将此设置为新数据帧的列,可以执行以下操作:

new_data = pd.DataFrame()
new_data['tsneY'] = df['tsneY'].values.tolist()

> new_data
       tsneY
0  20.740931
1  18.478468
2  22.948167
3  15.738954

谢谢@Chuck,你能解释一下吗?我在其他地方读到过df['A'].tolist()可以工作,我们不需要.values,所以我很困惑。 - Nicholas Humphrey
3
tolist() 只适用于numpy数组。 df ['A'] 是一个pandas系列对象,因此您必须首先通过使用 .values 将其转换为numpy对象。 - Chuck
非常感谢!从未想过那个。 - Nicholas Humphrey
2
df['A'].tolist() 在当前的 Pandas 中可以在 Series 上使用,而不仅仅是 Numpy。根据 @Jab 下面记录的解决方案,他的问题可能是原始 df 中有两列具有相同的名称。这也会产生相同的 .tolist() 错误,并且不能通过添加 .values 来解决。 - AvadData
@AvadData请将您的评论作为答案发布,这在大多数情况下都适用,谢谢。 - Akhil Saraswat
如果我将这个与iloc结合使用,我会得到一个包含每个值的列表(其中每个列表只有一个元素)。我不明白为什么会这样。我的代码是df.iloc[:,1:2].values.tolist()。是真的和iloc有关吗?还是我错过了什么? - Veritas_in_Numeris

0

我通过首先从数据框中提取相关列来解决了这个问题。

df = df.loc[:, ('type', 'tsneX', 'tsneY')

scatter = Scatter(df, x='tsneX', y='tsneY',
                  color='type', marker='type',
                  title='t-sne',
                  legend=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接