【问题标题】:ValueError: malformed node or string: 0 in Pandas [duplicate]ValueError:格式错误的节点或字符串:Pandas 中的 0 [重复]
【发布时间】: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

【问题讨论】:

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 2021-12-28
    • 2019-01-13
    • 2021-06-22
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多