【问题标题】:How to automatically skip rows that have non-floating values using pandas read_csv in python?如何在python中使用pandas read_csv自动跳过具有非浮动值的行?
【发布时间】:2021-02-01 08:51:53
【问题描述】:

我有数以千计的 .csv 文件,其中包含大量的感官数据,而且都是浮点数。但也有一些文件中的一些行显示日期和时间信息,并出现在文件的不同位置,如下图所示:

在上图中,前两行位于开头,但其他文件可以位于其他位置。使用pandasread_csv函数读取文件时,应该跳过这种非浮动行以避免错误。

我使用skiprows 函数在恒定行索引处跳过特定行,但问题是不需要的行在文件中的位置是可变的。

        for j in range(len(all_list)):
        path = os.path.join(path, all_list[j])
        # print(path)
        df_data = pd.read_csv(path, skiprows=[0, 1], header=None)
        print("data shape: ", df_data.shape)

我的问题是: 如何仅读取基于浮动的行并自动跳过所有文件中的非浮动数据?

【问题讨论】:

  • 您可能必须使用 python csv 模块并遍历每一行

标签: python pandas file


【解决方案1】:

您在导入到pandas.read_csv 时提供任意/固定的标头名称,然后处理数据帧以删除所有非浮点值

给定数据:

 import pandas as pd
 
 sample_csv=pd.read_csv('USERS.CSV',names=[X','Y','Z'], index_col=False)
 def is_float(x):
    try:
        float(x)
    except ValueError:
        return False
    return True

sample_csv[sample_csv.applymap(lambda x: is_float(x))].dropna()

输出:

最后,您可以调整标题。

【讨论】:

  • 是的,这个解决方案很适合我。谢谢。
【解决方案2】:
import pandas as pd  

# read csv
df_data = pd.read_csv(path, header=None)

# parse to numeric and set invalid values to NaN
df_data = df_data.apply(pd.to_numeric, errors='coerce')

# drop rows that contain NaN values
df_data = df_data.dropna()

【讨论】:

  • 我希望 read_csv() 有一个 errors='coerce',但这几乎一样好。显然假设您的整个数据框都是数字的。
【解决方案3】:

如果您的数据不包含缺失值(或者无论如何它们都将被删除),您可以使用read_csvconverters-功能和转换器,如

def conv(x):
    try:
        return float(x)
    except:
        return None

以及随后的.dropna()。如果NAs 是一个问题,您可以使用不同的信号值返回并通过一些布尔索引魔术过滤掉它们

【讨论】:

    【解决方案4】:

    您可以将 csv 作为文本加载,删除不需要的行并使用 pandas 读取:

    for j in range(len(all_list)):
        path = os.path.join(path, all_list[j])
        # print(path)
        with open(path) as f:
            l=f.readlines()
        l=[x[:-1].split(',') for x in l if '$' not in x]
       
        df_data = pd.DataFrame(l, columns=['A', 'B', 'C'])
        print("data shape: ", df_data.shape)
    

    我添加了 if '$' not in x 作为不需要的行的过滤器,如果它不够用,你需要替换它。

    【讨论】:

    • 是的,性能对我们很重要,因为我们有数千个文件。您的答案是迭代读取所有行然后写入它们,但这会降低性能。还有其他想法吗?
    • 我改进了关于性能的解决方案,它现在直接从列表中加载数据帧。请再次检查
    • 不要使用.readlines直接遍历文件对象。
    • 另外,我很确定你的 pandas 数据框会有不正确的 dtypes
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多