提取熊猫列的字典列表

时间:2020-07-01 10:22:40

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

在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,它为我提供了一个新的日期和登录页面表。我尝试使用列表理解来获取值,但这也给了我错误的结果。我可以想到的一种方法是使用循环来解决问题,但是我担心这样做效率不高。如何有效地做到这一点?

1 个答案:

答案 0 :(得分: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

如果由于字典的字符串不正确而无法使用:

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']