ValueError: неверный узел или строка: 0 в Pandas

У меня есть столбец, в котором значения сохраняются в виде словаря, и я использовал приведенный ниже код, чтобы разделить значения на два отдельных столбца, однако я борюсь со строками, которые имеют нулевые значения (см. сообщение об ошибке ниже): дф

product_id    product_ratings
2323          {"average_rating": 4.2, "number_of_ratings": 10}      
4433          {"average_rating": 4.3, "number_of_ratings": 31}
3454          {"average_rating": 4.5, "number_of_ratings": 23}
4552          {"average_rating": 4.1, "number_of_ratings": 13}
3422          None

требуемый_output_df

product_id   average_rating  number_of_ratings
2323         4.2             10
4433         4.3             31
3454         4.5             23
4552         4.1             13
3422         0               0 

Мой код:

import ast
import pandas as pd 
df = pd.read_csv('path')
df = df.fillna(0)

dict_df = pd.DataFrame([ast.literal_eval(i) for i in df.product_ratings.values])
df2 = df.drop('product_ratings',axis=1)
final_df = pd.concat([df2,dict_df],axis=1)
final_df

Однако я получаю следующую ошибку: ValueError: неправильный узел или строка: 0

Это {average_rating: 4.2, number_of_ratings: 10} не является допустимым словарным представлением. Правильный это {"average_rating": 4.2, "number_of_ratings": 10}

Dani Mesejo 14.12.2020 19:35

сори только что поменял

user12625679 14.12.2020 19:37

Отвечает ли это на ваш вопрос? Разделение словаря/списка внутри столбца Pandas на отдельные столбцы

noah 14.12.2020 19:38

предоставленное решение не сработало для меня

user12625679 14.12.2020 19:42

Кажется, у вас есть строка, которая не является ни словарем, ни литералом

Dani Mesejo 14.12.2020 19:43

да нулевые значения в необработанных данных не являются диктовкой

user12625679 14.12.2020 19:44

Попробуйте внести это изменение в утверждение dict_df = pd.DataFrame([ast.literal_eval(i) if type(i) is dict else 0 for i in df.product_ratings.values])

Stan11 14.12.2020 19:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
2 110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Давай попробуем:

df = pd.read_csv('path')


dict_df = pd.DataFrame([ast.literal_eval(i) if i !='None' or i is not None else 
                        dict()
                        for i in df.product_ratings.values]
                      ).fillna(0)

final_df = df.drop('product_ratings', axis=1).join(dict_df)

Выход:

   product_id  average_rating  number_of_ratings
0        2323             4.2               10.0
1        4433             4.3               31.0
2        3454             4.5               23.0
3        4552             4.1               13.0
4        3422             0.0                0.0

Я получаю сообщение об ошибке «неверный узел или строка: 0»

user12625679 14.12.2020 19:49

Можете ли вы попробовать еще раз без fillna(0) с обновленным кодом?

Quang Hoang 14.12.2020 19:52
Ответ принят как подходящий

Попробуйте преобразовать в словарь, иначе верните словарь со значениями по умолчанию:

def try_literal_eval(e):
    try:
        return ast.literal_eval(e)
    except ValueError:
        return {'average_rating': 0, 'number_of_ratings': 0}


res = pd.DataFrame(df['product_ratings'].apply(try_literal_eval).tolist())
output = pd.concat((df.drop('product_ratings', 1), res), axis=1)
print(output)

Выход

   product_id  average_rating  number_of_ratings
0        2323             4.2                 10
1        4433             4.3                 31
2        3454             4.5                 23
3        4552             4.1                 13
4        3422             0.0                  0

Другие вопросы по теме