【问题标题】:pd.ExcelFile: file contains lists of floats, but the lists are imported as a stringpd.ExcelFile:文件包含浮点数列表,但列表作为字符串导入
【发布时间】:2018-03-18 13:42:54
【问题描述】:

我将浮点数列表导出到一个 excel 文件中,现在我想再次将其作为数据框导入。我得到了一个 10x7 的数据框,看起来一切都很好,除了我所有的列表都存储为一个字符串(我猜这是有道理的,因为 excel 不知道列表是什么,对吧?)。我正在使用此代码导入文件:

pd.ExcelFile('fitness.xlsx')

使用转换器参数没有帮助。你知道是否有一种简单的方法可以将我的列表直接导入为包含浮点数的列表?我应该首先导出为不同的格式吗?如果是这样,哪一个可以处理我的数据格式?目前我的条目如下所示:

In:
xl_var.loc[xl_var['stimulus'] == -2, 'first spike'].values
Out:
array(['[14.25, 11.649999999999864]'], dtype=object)

这就是我导入的数据框的样子。您会看到我的最后一列甚至包含 2D 列表,这使得之后的转换有点混乱。

这就是我要导入的 excel 文件的样子。

【问题讨论】:

  • 我不认为它是一个二维列表,只是一个 Pandas 无法显示的长列表,尝试 pd.set_option('max_colwidth',50) 看看
  • 我不知道如何向您证明,但我知道最后一列“平均尖峰形状”包含存储在一个列表中的多个列表(那是 2D 对吗?) .恐怕你现在只需要相信我:p
  • 这里没有信任问题,我只是想到了一种可能,请您尝试一下:)

标签: python excel string list pandas


【解决方案1】:

可以使用eval() 将列表的字符串表示形式转换为列表。对于单个列,使用.apply(),如下所示:

xl_var['first spike'].apply(eval)

如果要转换所有列,可以使用 .applymap() 和要转换的列列表:

cols = ['first spike', 'number spikes', 'peak', 'undershoot']
xl_var[cols] = xl_var[cols].applymap(eval)

在最后一列的情况下,您需要使用字符串函数来删除“数组”,以便eval 可以像 python 列表一样处理它们,或者您可以从 numpy 导入 array 以允许eval 将它们转换为 numpy 数组。

from numpy import array
xl_var['average spike shape'].apply(lambda x:eval(x, globals()))

例子:

import pandas as pd
from numpy import array

xl_var = pd.DataFrame.from_items((('stimulus',[-2, -1.75]), 
                                  ('first spike',['[14.25, 11.65]', '[14.15, 13.27]']), 
                                   ('arrays', ['[array([1,2]),array([3,4])]','[array([5,6]),array([7,8])]']) ))

In :
xl_var['first spike'].values
Out:
array(['[14.25, 11.65]', '[14.15, 13.27]'], dtype=object)

In :
xl_var['first spike'].apply(eval)
Out:
0    [14.25, 11.65]
1    [14.15, 13.27]
Name: first spike, dtype: object

In :
xl_var['arrays'].values
Out:
array(['[array([1,2]),array([3,4])]', '[array([5,6]),array([7,8])]'], dtype=object)

In :
xl_var['arrays'].apply(lambda x:eval(x,globals())).values
Out:
array([list([array([1, 2]), array([3, 4])]),
       list([array([5, 6]), array([7, 8])])], dtype=object)

【讨论】:

  • 这看起来和我要找的完全一样!我稍后会尝试并回复您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多