【问题标题】:Reading csv containing a list in Pandas读取包含熊猫列表的csv
【发布时间】:2014-01-14 23:32:12
【问题描述】:

我正在尝试将这个 csv 读入 pandas

HK,"[u'5328.1', u'5329.3', '2013-12-27 13:58:57.973614']"
HK,"[u'5328.1', u'5329.3', '2013-12-27 13:58:59.237387']"
HK,"[u'5328.1', u'5329.3', '2013-12-27 13:59:00.346325']"

如您所见,只有 2 列,第二列是列表,使用 pd.read_csv() 带参数?

谢谢

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    一种选择是使用ast.literal_eval 作为转换器:

    >>> import ast
    >>> df = pd.read_clipboard(header=None, quotechar='"', sep=',', 
    ...                   converters={1:ast.literal_eval})
    >>> df
        0                                             1
    0  HK  [5328.1, 5329.3, 2013-12-27 13:58:57.973614]
    1  HK  [5328.1, 5329.3, 2013-12-27 13:58:59.237387]
    2  HK  [5328.1, 5329.3, 2013-12-27 13:59:00.346325]
    

    如果需要,将这些列表转换为 DataFrame,例如:

    >>> df = pd.DataFrame.from_records(df[1].tolist(), index=df[0],
    ...                           columns=list('ABC')).reset_index()
    >>> df['C'] = pd.to_datetime(df['C'])
    >>> df
        0       A       B                          C
    0  HK  5328.1  5329.3 2013-12-27 13:58:57.973614
    1  HK  5328.1  5329.3 2013-12-27 13:58:59.237387
    2  HK  5328.1  5329.3 2013-12-27 13:59:00.346325
    

    【讨论】:

    • 类似于我从 read_csv() documentation 获得的 (pd.read_csv(dtype={'a': str, 'b': list})),但是它没有按要求将列表的值放入列中。
    • 这很有帮助,尽管我想知道在使用 Pandas 解析之前是否应该更好地处理 csv 文件(即清理列)。
    • @Ewan :这真的对你有用吗?对我来说,它说:dtype not理解
    【解决方案2】:
    df['new_column'] = df['column'].apply(lambda x: ast.literal_eval(x))
    

    只需在包含列表的列上运行上面的代码作为字符串。

    【讨论】:

      【解决方案3】:

      根据 alko 的回答,您可以使用第一部分的 df.apply() 函数来读取列表字符串中的实际数据:

       >>> df = pd.read_clipboard(header=None,sep=',')
       >>> df
           0                                                  1
        0  HK  [u'5328.1', u'5329.3', '2013-12-27 13:58:57.97...
        1  HK  [u'5328.1', u'5329.3', '2013-12-27 13:58:59.23...
        2  HK  [u'5328.1', u'5329.3', '2013-12-27 13:59:00.34...
       >>> df[1] = df[1].apply(eval)
       >>> df
           0                                             1
        0  HK  [5328.1, 5329.3, 2013-12-27 13:58:57.973614]
        1  HK  [5328.1, 5329.3, 2013-12-27 13:58:59.237387]
        2  HK  [5328.1, 5329.3, 2013-12-27 13:59:00.346325]
      

      【讨论】:

      【解决方案4】:

      在 python 中使用 .strip()。

      with open(csvfile, 'r')as infile:
          reader = csv.reader(infile)
          for row in reader:
              col1 = row[0]
              col2 = row[1:].strip("[]")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 2015-05-09
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多