Как автоматически пропускать строки с неплавающими значениями, используя pandas read_csv в python?

#python #pandas #file

#python #pandas #файл

Вопрос:

У меня есть тысячи .csv файлов, содержащих огромное количество сенсорных данных, все в плавающих числах. Но также в некоторых строках в некоторых файлах отображается информация о дате и времени, и она отображается в разных местах файлов, как показано на рисунке ниже:

введите описание изображения здесь

На приведенном выше изображении первые две строки находятся в начале, но могут находиться в других местах для других файлов. Такого рода неплавающие строки следует пропускать при чтении файлов с помощью read_csv функции pandas, чтобы избежать ошибок.

Я использовал 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)
 

Мой вопрос:
Как я могу читать только строки с плавающей запятой и автоматически пропускать неплавающие данные из всех файлов?

Комментарии:

1. вероятно, вам придется использовать модуль python csv и выполнять итерации по каждой строке

Ответ №1:

 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()
 

Комментарии:

1. Я бы хотел, чтобы в read_csv() было errors=’принудительное использование’, но это почти так же хорошо. Очевидно, предполагается, что весь ваш фрейм данных является числовым.

Ответ №2:

Вы указываете любое произвольное / фиксированное имя заголовка при импорте 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()
 

Вывод:
введите описание изображения здесь

И, наконец, вы можете настроить заголовки.

Комментарии:

1. Да, это решение отлично работает со мной. Спасибо.

Ответ №3:

Если ваши данные не содержат пропущенных значений (или если они все равно будут удалены), вы можете использовать read_csv s converters -функциональность с помощью такого конвертера, как

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

и последующее .dropna() . Если NA s вызывает беспокойство, вы можете использовать другое значение сигнала для возврата и отфильтровать их с помощью некоторой логической магии индексации

Ответ №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 '

Я добавил if  '$' not in x  в качестве фильтра для нежелательных строк, вам нужно заменить его, если он не подходит.


Комментарии:

1. Да, производительность важна для нас, поскольку у нас тысячи файлов. Ваш ответ повторяется, чтобы прочитать все строки, а затем записать их, но это снизит производительность. Есть еще идеи?

2. Я улучшил свое решение в отношении производительности, теперь оно загружает фрейм данных непосредственно из списка. Пожалуйста, проверьте еще раз

3. Не используйте .readlines итерацию непосредственно над объектом file.

4. Кроме того, я уверен, что ваш фрейм данных pandas будет иметь неправильные dtypes

not in x]

df_data = pd.DataFrame(l, columns=['A', 'B', 'C'])
print("data shape: ", df_data.shape)
Я добавил if '$' not in x в качестве фильтра для нежелательных строк, вам нужно заменить его, если он не подходит.

Комментарии:

1. Да, производительность важна для нас, поскольку у нас тысячи файлов. Ваш ответ повторяется, чтобы прочитать все строки, а затем записать их, но это снизит производительность. Есть еще идеи?

2. Я улучшил свое решение в отношении производительности, теперь оно загружает фрейм данных непосредственно из списка. Пожалуйста, проверьте еще раз

3. Не используйте .readlines итерацию непосредственно над объектом file.

4. Кроме того, я уверен, что ваш фрейм данных pandas будет иметь неправильные dtypes