Добавление режима к столбцу данных создает только значение в первой строке данных - PullRequest
1 голос
/ 27 мая 2019

После того, как я столкнулся с некоторыми битыми CSV-файлами в прошлом, я работаю над небольшим кодом Python, который позволяет отфильтровывать эти ошибочные строки, чтобы я мог вручную проверить их на наличие паттернов и, если возможно, исправить их.

Однако, когда я хочу добавить правильное количество столбцов, я ожидаю, что файл будет иметь, я получаю только наиболее частое наблюдение "режима" в разделителе в первой строке, а не во всех строках.

ЭтоРазбитый файл CSVS обычно появляется, если в строке больше разделительных разделителей, чем в столбцах (например, если у имени клиента также есть символ «а», а затем Excel разбивает его, а также перемещает все столбцы на один вправо).для каждого чанка, который я загружаю, вижу количество разделителей в первом столбце, сравниваю его с «правильным» количеством разделителей для чанка (я упрощаю это, используя режим как консенсус), а затем просто отправляю эти ошибочные строки в список.

Я полагаю, что ошибка возникает из-за того, что я использую панд, я новичок в кодировании, и хотя панды кажутся идеальными для обработки данных, я все еще читаю о том, как правильно обращаться к столбцам и строкам.

Код проходит через мои сотни CSV-файлов, загружает их в виде кусочков на основе совершенно необычного разделителя в этом случае |.Это создает фрейм данных, в котором вся строка csv объединена в одном поле, что позволяет мне, в свою очередь, подсчитать правильный разделитель (в данном случае;).

la=[]
for filename in all_files:
     for chunk in pd.read_csv(filename, sep='|', chunksize=1000000):
         chunk['filename'] = os.path.basename(filename)
         chunk["delimeters"] = chunk.iloc[:,0].str.count(',')
         chunk['good delimeter'] = chunk["delimeters"].mode()

         for index, row in chunk.iterrows():
             if row['delimeters'] != chunk['good delimeter']:
               la.append(row)
             else: 
               print("all good")


print(la) 

В настоящее время моей главной проблемой является то, что когдаЯ смотрю в свой блок данных чанка, счетчик разделителей работает хорошо, однако режим добавляется только к первой строке, поэтому, когда я смотрю на чанк, он выглядит следующим образом:

    Name| Filename| delimetier| good delimeter
    A     123       48         48
    B     123       48         Nan
    C     123       49         Nan
    D     123       48         Nan

Однако я хотел бы иметь режимстолбца разделителя, добавленного ко всем, чтобы я мог сравнить их с оператором if и отфильтровать строки ошибок.

При запуске этого сценария для этого поста я также сталкиваюсь со следующей ошибкой:

ValueError: Значение истинности Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Однако я предполагаю, что это ошибка наблюдения, вызванная Nan

1 Ответ

0 голосов
/ 27 мая 2019

Эта строка не возвращает / не присваивает скалярное значение, а массив numpy:

chunk['good delimeter'] = chunk["delimeters"].mode()

Измените его на:

chunk['good delimeter'] = chunk["delimeters"].mode()[0]

, который назначит значение режима всем строкам с типом numpy.float64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...