ValueError:格式错误的节点或字符串:Pandas 中的 0 [重复]

Posted

技术标签:

【中文标题】ValueError:格式错误的节点或字符串:Pandas 中的 0 [重复]【英文标题】:ValueError: malformed node or string: 0 in Pandas [duplicate] 【发布时间】:2021-03-25 10:07:07 【问题描述】:

我有一列将值保存为字典,我使用下面的代码将值解开到两个单独的列中,但是,我正在努力处理具有 Null 值的行(请参阅下面的错误消息): df

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

desired_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: malformed node or string: 0

【问题讨论】:

average_rating: 4.2, number_of_ratings: 10 不是有效的字典表示。右边是"average_rating": 4.2, "number_of_ratings": 10 sry 刚刚改了 这能回答你的问题吗? Splitting dictionary/list inside a Pandas Column into Separate Columns 提供的解决方案对我不起作用 看来你的字符串既不是字典也不是文字 【参考方案1】:

让我们试试吧:

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) 的情况下使用更新后的代码重试吗?【参考方案2】:

尝试转换为字典,否则返回默认值的字典:

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

【讨论】:

以上是关于ValueError:格式错误的节点或字符串:Pandas 中的 0 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:错误的节点或字符串:<_ast.Name object at 0x0000016835AEE3D0>

ValueError:格式错误的字符串? [关闭]

python/Pyqt5 - 如何在使用 ast 和获取 ValueError 时避免 eval:attemt 中的格式错误的字符串以提高代码安全性

带 f 字符串的花括号 - ValueError:字符串格式说明符中不允许符号 [重复]

FastAPI - 格式错误的十六进制 UUID 字符串

ValueError:无法将字符串转换为浮点数:'31,950'