【问题标题】:Extracting a list of dicts for a Pandas column为 Pandas 列提取字典列表
【发布时间】:2020-07-01 10:22:40
【问题描述】:

我在 pandas 列中有一个字典列表,用于指定特定关键字的登录页面。

keyword   | 07-31-2019 | landing_pages                                          |
cloud api |     50     | [{'url' : 'www.example.com', 'date' : '07-31-2019'}, {'url' ... ]|
database  |     14     | [{'url' : 'www.example.com/2', 'date' : '08-30-2019'} ... ]|

*实际上有很多日期列,但我只显示了1个。

我的问题是我已经有每个日期的列,所以我想将登录页面提取为一个列表并将其作为一个新列。

keyword   | 07-31-2019 | landing_pages
cloud api |    50      | www.example.com, www.example.com/other
database  |    14      | www.example.com/2, www.example.com/3

到目前为止,我已经尝试使用 json_normalize,它为我提供了一个新的日期表和登录页面。我试过用列表理解来获取值,但这也给了我错误的结果。我能想到的一种方法是使用循环来解决问题,但我担心这效率不高。我怎样才能有效地做到这一点?

【问题讨论】:

    标签: json python-3.x pandas dataframe dictionary


    【解决方案1】:

    使用带有join 的生成器提取url 值(如果数据是字典):

    df['landing_pages'] = df['landing_pages'].apply(lambda x: ', '.join(y['url'] for y in x))
    print (df)
         keyword  07-31-2019      landing_pages
    0  cloud api          50    www.example.com
    1   database          14  www.example.com/2
    

    如果因为字典的字符串 repr 而不起作用:

    import ast
    
    df['landing_pages'] = df['landing_pages']
                              .apply(lambda x: ', '.join(y['url'] for y in ast.literal_eval(x)))
    

    编辑:如果想要最近日期的最大url 创建DataFrame 并通过索引值添加新键,然后从字符串转换日期时间并最后使用DataFrameGroupBy.idxmax 作为最大日期时间的索引,按DataFrame.loc 选择行使用urls 并最后将url 列分配给原始DataFrame:

    L = [dict(x, **{'i':k}) for k, v in df['landing_pages'].items() for x in v]
    
    df1 = pd.DataFrame(L)
    df1['date'] = pd.to_datetime(df1['date'])
    
    df['url by max date'] = df1.loc[df1.groupby('i')['date'].idxmax()].set_index('i')['url']
    

    【讨论】:

    • 谢谢,您如何建议只获取与其关联的最近日期的 URL?
    • 再次感谢您修改后的答案!
    猜你喜欢
    • 2020-01-21
    • 2022-10-13
    • 1970-01-01
    • 2022-12-01
    • 2014-01-05
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多