【问题标题】:Bokeh: AttributeError: 'DataFrame' object has no attribute 'tolist'散景:AttributeError:“DataFrame”对象没有属性“tolist”
【发布时间】:2017-07-08 01:14:17
【问题描述】:

我是熊猫和散景的新手,我正在尝试从熊猫数据框创建散点图。但是,我不断收到以下错误:

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

使用来自 bokeh 的虚拟数据(来自 bokeh.sampledata.iris 导入花作为数据),分散效果很好。

   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 列是什么?
  • 它有超过 50.000 列,所以这不是很容易做到的。但是我通过 df = df.loc[:, ('type', 'tsneX', 'tsneY')] 让它工作。我不知道这是如何解决问题的,但它确实有效..
  • 不清楚 - 散景有什么问题?
  • AttributeError: 'DataFrame' object has no attribute 'tolist' 是 Scatter() 的结果,所以我认为是 Bokeh 问题。但是,通过删除冗余列它可以工作

标签: python pandas bokeh


【解决方案1】:

您错误地使用了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,所以我很困惑。
  • @NicholasHumphrey tolist() 仅作用于 numpy 数组。 df['A'] 是 pandas 系列对象,所以必须先使用 .values 将其转换为 numpy 对象。
  • 非常感谢!从来没想过。
  • df['A'].tolist() 在当前的 pandas 中确实适用于一系列,而不仅仅是 numpy。鉴于下面的解决方案@Jab 文档,他的问题可能是原始 df 中具有相同名称的 2 列。这也会产生相同的 .tolist() 错误,并且不能通过添加 .values 来解决
  • @AvadData 请将您的评论作为答案,它适用于大多数情况,谢谢
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2017-01-24
    • 2018-10-10
    • 2019-08-18
    • 2021-01-20
    相关资源
    最近更新 更多