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