У меня есть столбец, в котором значения сохраняются в виде словаря, и я использовал приведенный ниже код, чтобы разделить значения на два отдельных столбца, однако я борюсь со строками, которые имеют нулевые значения (см. сообщение об ошибке ниже): дф
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
сори только что поменял
Отвечает ли это на ваш вопрос? Разделение словаря/списка внутри столбца Pandas на отдельные столбцы
предоставленное решение не сработало для меня
Кажется, у вас есть строка, которая не является ни словарем, ни литералом
да нулевые значения в необработанных данных не являются диктовкой
Попробуйте внести это изменение в утверждение dict_df = pd.DataFrame([ast.literal_eval(i) if type(i) is dict else 0 for i in df.product_ratings.values])
Давай попробуем:
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»
Можете ли вы попробовать еще раз без fillna(0)
с обновленным кодом?
Попробуйте преобразовать в словарь, иначе верните словарь со значениями по умолчанию:
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
Это
{average_rating: 4.2, number_of_ratings: 10}
не является допустимым словарным представлением. Правильный это{"average_rating": 4.2, "number_of_ratings": 10}