【问题标题】:In pandas/python, reading array stored as string在 pandas/python 中,读取存储为字符串的数组
【发布时间】:2014-05-31 22:01:55
【问题描述】:

我有一个 pandas 数据框,其中一列的每个元素都有字符串数组。

所以是这样的。

  col1 col2
0 120  ['abc', 'def']
1 130  ['ghi', 'klm']

现在,当我使用 to_csv 将其存储到 csv 时,它似乎很好。 当我使用 from_csv 读回它时,我似乎读回了它。 但是当我分析每个单元格中的值时,数组是

'[' ''' 'a' 'b' 'c' 等等。 所以本质上它不是将它作为一个数组读取,而是一组字符串。有人可以建议我如何将此字符串转换为数组吗?

我的意思是说数组已经像字符串一样存储了

'[\'abc\',\'def\']'

【问题讨论】:

    标签: python arrays csv pandas dataframe


    【解决方案1】:

    正如其他问题中提到的,你应该在这里使用literal_eval

    from ast import literal_eval
    df['col2'] = df['col2'].apply(literal_eval)
    

    在行动:

    In [11]: df = pd.DataFrame([[120, '[\'abc\',\'def\']'], [130, '[\'ghi\',\'klm\']']], columns=['A', 'B'])
    
    In [12]: df
    Out[12]:
         A              B
    0  120  ['abc','def']
    1  130  ['ghi','klm']
    
    In [13]: df.loc[0, 'B']  # a string
    Out[13]: "['abc','def']"
    
    In [14]: df.B = df.B.apply(literal_eval)
    
    In [15]: df.loc[0, 'B']  # now it's a list
    Out[15]: ['abc', 'def']
    

    【讨论】:

    • 我能解释一下literal_eval是如何解决上述问题的吗?
    • @HammadHassan 它尝试将字符串解析为 python 对象,类似于 json.loads。
    • 我很确定这比使用 pandas 自己的 split 函数要慢 - 请参阅下面的答案。
    【解决方案2】:

    没关系。

    我要做的就是

    arr = s[1:-1].split(',')
    

    这去掉了方括号,并将字符串拆分为我想要的数组。

    【讨论】:

      【解决方案3】:

      如果没有 pandas,这是使用 ast 模块的 literal_eval() 的一种方法:

      >>> data = "['abc', 'def']"
      >>> import ast
      >>> a_list = ast.literal_eval(data)
      >>> type(a_list)
      <class 'list'>
      >>> a_list[0]
      'abc'
      

      【讨论】:

      • 对于熊猫,你也应该使用literal_eval!
      • @AndyHayden 啊,好吧!没用过熊猫,不知道:)
      • 这正是我想要的。
      【解决方案4】:

      也许尝试使用不同的分隔符值?像这样:

      DataFrame.to_csv(filepath, sep=';')
      

      然后阅读

      DataFrame.from_csv(filepath, sep=';')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        相关资源
        最近更新 更多