【问题标题】:How to get values in a dictionary-like string and sort the output all within the column in a dataframe?如何在类似字典的字符串中获取值并对数据框中的列中的所有输出进行排序?
【发布时间】:2021-01-22 12:56:51
【问题描述】:

我正在尝试分析数据 - https://www.kaggle.com/tmdb/tmdb-movie-metadata?select=tmdb_5000_movies.csv

数据集中有一列(类型)如下所示:

d = {'genres' : [[{"id": 35, "name": "Comedy"}, {"id": 10749, "name": "Romance"}], [], [{"id": 35, "name": "Comedy"}, {"id": 10749, "name": "Romance"}, {"id": 10769, "name": "Foreign"}]]}

df = pd.DataFrame(data=d)

所以我想要按字母顺序排列的电影类型的输出名称

d_output = {'genres': [['Comedy', 'Romance'], [], ['Comedy', 'Foreign', 'Romance']]}

df_output = pd.DataFrame(data=d_output)

【问题讨论】:

    标签: python pandas numpy dictionary lambda


    【解决方案1】:

    列表推导是最简单的方法:

    pd.DataFrame({'genres':[sorted([x['name'] for x in y]) for y in df['genres']]})
    

    输出:

                           genres
    0           [Comedy, Romance]
    1                          []
    2  [Comedy, Foreign, Romance]
    

    更新:我没有注意到您的数据存储为csv,因此genres 是字符串类型,而不是您的示例数据中的列表。在这种情况下:

    df.genres.str.extractall('"name": "(\w+)"').sort_values([0]).groupby(level=0).agg(list)
    

    输出:

                                0
    0           [Comedy, Romance]
    2  [Comedy, Foreign, Romance]
    

    【讨论】:

    • 这不会按字母顺序排列流派。
    【解决方案2】:

    这是另一个不错的列表推导式,它返回按字母排序的列表

    names = sorted([i['name'] for chunk in d["genres"] for i in chunk])
    

    输出:

    ['Comedy', 'Comedy', 'Foreign', 'Romance', 'Romance']
    

    这样做并删除重复项:

    from collections import OrderedDict
    
    names = list(OrderedDict.fromkeys(sorted([i['name'] for chunk in d["genres"] for i in chunk])))
    print(names)
    

    输出:

    ['Comedy', 'Foreign', 'Romance']
    

    【讨论】:

      【解决方案3】:

      如果您将 python dict 对象序列化为 csv 文件中的文本并再次读入数据框,您将得到如下内容:

      d = '''{'genres' : [[{"id": 35, "name": "Comedy"}, {"id": 10749, “名称”:“浪漫”}],[],[{“id”:35,“名称”:“喜剧”},{“id”:10749, "name": "Romance"}, {"id": 10769, "name": "Foreign"}]]}'''

      df = pd.DataFrame({'genres': [d]})

      您可以使用正则表达式解析字符串本身,正如@Quang Hoang 建议的那样。我个人认为这可能很容易出错(或者至少可读性较差),虽然很优雅

      假设你有有效的python dicts,你可以使用

      import ast
      df['genres'] = df.genres.apply(ast.literal_eval)
      

      将序列化的字符串解析为 python 字典。如果对象也是有效的 json,您也可以使用 json 模块。

      然后正常继续列表推导。

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 2018-02-28
        相关资源
        最近更新 更多