【问题标题】:Converting list of strings to list of floats in pandas将字符串列表转换为熊猫中的浮点数列表
【发布时间】:2017-09-17 12:25:13
【问题描述】:

我有一个我认为是超级基本问题的问题,但我无法找到解决方案。简而言之,我在csv 中有一个列,它是一个数字列表。这个csv 是由pandasto_csv 生成的。当尝试使用read_csv 重新读取它时,它会自动将此数字列表转换为string

然后尝试使用它时,我显然会遇到错误。当我尝试使用 to_numeric 函数时,我也会收到错误,因为它是一个列表,而不是单个数字。

有没有办法解决这个问题?在下面发布表单代码,但可能不是很有帮助:

def write_func(dataset):
    features = featurize_list(dataset[column])  # Returns numpy array
    new_dataset = dataset.copy()  # Don't want to modify the underlying dataframe
    new_dataset['Text'] = features
    new_dataset.rename(columns={'Text': 'Features'}, inplace=True)
    write(new_dataset, dataset_name)

def write(new_dataset, dataset_name):
    dump_location = feature_set_location(dataset_name, self)
    featurized_dataset.to_csv(dump_location)

def read_func(read_location):
    df = pd.read_csv(read_location)
    df['Features'] = df['Features'].apply(pd.to_numeric)

Features 列是有问题的列。当我尝试运行当前在 read_func 中的 apply 时,我收到此错误:

ValueError: Unable to parse string "[0.019636873200000002, 0.10695576670000001,...]" at position 0

我不可能是第一个遇到这个问题的人,有没有办法在读/写时处理这个问题?

【问题讨论】:

    标签: python csv pandas numpy


    【解决方案1】:

    我已经稍微修改了你的最后一个函数,它工作正常。

    def read_func(read_location):
        df = pd.read_csv(read_location)
        df['Features'] = df['Features'].apply(lambda x : pd.to_numeric(x))
    

    【讨论】:

    • 由于性能原因,这对我来说并不容易处理。这是我正在转换的一个相当大的文件,它会遍历每个列表中的每个条目。
    【解决方案2】:

    您想使用literal_eval 作为converter 传递给pd.read_csv。以下是其工作原理的示例。

    from ast import literal_eval
    form io import StringIO
    import pandas as pd
    
    txt = """col1|col2
    a|[1,2,3]
    b|[4,5,6]"""
    
    df = pd.read_csv(StringIO(txt), sep='|', converters=dict(col2=literal_eval))
    print(df)
    
      col1       col2
    0    a  [1, 2, 3]
    1    b  [4, 5, 6]
    

    【讨论】:

    • 这样安全吗? literal_eval 勾勒了我很多,我无法完全控制这里的输入文件。他们从远程服务器上拉下来。
    • 我同样被eval 勾勒出来...literal_eval 旨在通过安全解析文字来减轻这种恐惧。见this post
    • 这似乎...可行,但这真的是唯一的方法吗?对于感觉像一个非常基本的用例的东西来说,这真是太不可思议了。需要明确的是,这确实有效。
    • 不,这不是……另一种方式更痛苦。你可以自己解析字符串。
    • @SlaterTyranus 并不是说​​它不是一个常见的用例,而是 pandas 主要处理数字和字符串。它不能很好地支持这种结构。如果它们都是列表,你可以只使用 json 来解析它们(即json.loads('[1.0, 2.0]'))我不确定这是否可以像 piRSquared 那样作为转换器传递,但它似乎是可行的。
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多