Python и Панды: Как обращаться к значениям NaN в цикле?

#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))