#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