Как удалить столбец NaN?

#python #python-3.x #pandas #dataframe

#python #python-3.x #pandas #фрейм данных

Вопрос:

У меня есть текстовый файл, содержащий 3 столбца типа:

 1  2  3
2  4  6
3  6  9
  

Я хочу упорядочить его следующим образом:

 wave  shape  freq
  1     2      3
  2     4      6
  3     6      9 
  

Я использовал следующий скрипт:

 import glob
import pandas as pd


import_file = glob.glob('data.txt')
for files in import_file:
     intial_data = pd.read_csv(files, header=None, delimiter="t").values
     table = pd.DataFrame(intial_data, columns = ['wave' , 'shape', 'freq')
      print(table)
  

Это дало мне это

Ошибка: Форма передаваемых значений равна (4, 150), индексы подразумевают (3, 150)

Я заменил строку, которая упорядочивает и описывает таблицу, добавив другой индикатор столбца X

 table = pd.DataFrame (intial_data, columns = ['wave' , 'shape', 'freq','x'])
  

Тонкий, он работает хорошо и дал мне этот результат

        wave     shape    freq     x
 0    1.0000   2.0000   3.0000   NaN
 1    2.0000   4.0000   6.0000   NaN
 2    3.0000   6.0000   9.0000   NaN
  

Я не могу понять, какой у нас столбец NaN, и мне нужно удалить его из моей работы

Пожалуйста, есть предложения??

Ответ №1:

Не принимайте предложения удалить NaN s. Это было бы скорее решением XY Problem , чем причиной.

Используйте вместо

 intial_data = pd.read_csv('data.txt', header=None, delim_whitespace=True)
  

или

 intial_data = pd.read_csv('data.txt', header=None, sep='s ')
  

Причина, по которой вы получаете эту ошибку, заключается в том, что в конце вашего data.txt файла есть дополнительная вкладка. pandas интерпретирует это как дополнительный столбец NaN s.

Итак, даже если вы видите

 1  2  3
2  4  6
3  6  9
  

что у вас, скорее всего, есть

 1t2t3t
2t4t6t
3t6t9t
  

Последнее t добавляет дополнительный столбец.

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

1. @etshoo итак open(data.txt).read() и выясните, каков истинный разделитель 😉

2. @RafaelCe разделителем является t

3. @etshoo не возражает опубликовать, почему именно open(data.txt).read() выводит? (конечно, только несколько первых строк)

4.298.08 1.8292 1.8236 299.52 1.8362 1.8306 300.97 1.8434 1.8378 302.44 1.8507 1.8452 303.92 1.8581 1.8527

5. @etshoo не значения, а фактическую строку (где мы можем видеть символы n и t )

Ответ №2:

 df.dropna(1,'all')
  

Вывод:

    wave  shape  freq
0   1.0    2.0   3.0
1   2.0    4.0   6.0
2   3.0    6.0   9.0
  

Или в качестве альтернативы вы можете просто прочитать первые 3 столбца из вашего файла с usecols параметром pd.read_csv . С помощью следующего кода вы получаете свою table переменную прямо, без предварительного чтения intial_data :

 table = pd.read_csv(files,
                    header=None,
                    delimiter="t",
                    usecols=range(3),
                    names=['wave', 'shape', 'freq'])
  

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

1. То есть пользователь должен писать 3 жестко в коде? Что, если вы заранее не знаете количество столбцов?

2. Это была бы другая проблема. Ваш код также не будет работать, если столбец nan находится между двумя столбцами, отличными от nan (что также является другой проблемой). Удаление будет работать во всех этих случаях

3. Также OP устанавливает имена столбцов равными [‘wave’, ‘shape’, ‘freq’], поэтому я полагаю, что мы знаем, сколько столбцов у нас есть, иначе это было бы невозможно

4. @perl Ну, ваш первый аргумент меня не убедил, потому что наличие NaN s в середине могло бы быть в порядке вещей (они, вероятно, были бы желательны). Но ваш последний комментарий справедлив;}

5. @RafaelC: итак, если nan требуется значение посередине, то мы должны использовать sep='t' а не delim_whitespace=True or sep='s ' , верно? Например, если у меня есть строка «1 t2 t t3 t», с sep='t' она становится [1,2,np.nan, 3,np.nan], но с delim_whitespace=True или sep='s ' мы получаем [1,2,3]