#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
orsep='s '
, верно? Например, если у меня есть строка «1 t2 t t3 t», сsep='t'
она становится [1,2,np.nan, 3,np.nan], но сdelim_whitespace=True
илиsep='s '
мы получаем [1,2,3]