#python #pandas #csv #nan
Вопрос:
С Python и Пандами я пытаюсь брать значения из ячеек CSV и записывать их в виде txt-файлов через цикл. Структура CSV-файла такова:
user_id, text, text_number
0, test text A, text_0
1,
2,
3,
4,
5, test text B, text_1
Приведенный ниже сценарий успешно записывает файл txt для первой строки — он называется text_0.txt и содержит test text A
.
import pandas as pd
df= pd.read_csv("test.csv", sep=",")
for index in range(len(df)):
with open(df["text_number"][index] '.txt', 'w') as output:
output.write(df["text"][index])
Однако я получаю сообщение об ошибке, когда он переходит к следующей строке:
TypeError: write() argument must be str, not float
Я предполагаю, что ошибка возникает, когда она обнаруживает значения, которые она считывает как NaN
. Я попытался добавить эту dropna
функцию в документацию pandas следующим образом:
import pandas as pd
df= pd.read_csv("test.csv", sep=",")
df2 = df.dropna(axis=0, how='any')
for index in range(len(df)):
with open(df2["text_number"][index] '.txt', 'w') as output:
output.write(df2["text"][index])
Однако та же проблема сохраняется — для первой строки создается файл txt, но для следующей строки возвращается новое сообщение об ошибке: KeyError: 1
.
Есть какие-нибудь предложения? Вся помощь очень признательна.
Комментарии:
1.
output.write(str(df["text"][index]))
?2. Спасибо — к сожалению, генерируется та же
KeyError: 1
ошибка.3. Что такое индекс
df
?index
должен быть действительный индекс фрейма данных, а не позиционный индексатор. Может'1'
быть, и нет1
.4. Спасибо — не могли бы вы поподробнее? Что мне нужно сделать, чтобы установить действительный индекс?
5. Попробуйте
df = df.fillna('')
, у вас все еще есть ошибка? nb. Вы можете сделать это до или послеdropna
, в зависимости от того, нужен ли вам файл для строк NA.
Ответ №1:
Проблема здесь в том, что вы создаете индекс диапазона, который не обязательно находится в индексе фрейма данных. В вашем случае использования вы можете просто перебирать строки фрейма данных и записывать в файл.
for t in df.itertuples():
if t.text_number: # do not write if text number is None
with open(t.text_number '.txt', 'w') as output:
output.write(str(t.text))