DataFrame:基于其他列的新列,带有字符串dictionary/json



我有下面的pandas DataFrame,其中(我想是?(一个字符串作为列"中的嵌套JSON;桶";。

id      name    bucket
0   11324   Soaps   {"page":{"url":"https://www.url.com", "color":"white"} ...}
0   11325   Cans    {"page":{"url":"https://www.url.com", "color":"black"} ...}
0   11326   Boxes   {"page":{"url":"https://www.url.com", "color":"red"} ...}

以下是数据类型:

dtypes
id                           int64
name                         object
bucket                       object

我想知道我如何访问列"中的值;"桶";,这样我就可以创建一个具有相应值的新列:

id      name    bucket.                                                          color
0   11324   Soaps   {"web":{"project":"https://www.url1.com", "color":"white"} ...}  white
0   11325   Cans    {"web":{"project":"https://www.url2.com", "color":"white"} ...}  black
0   11326   Boxes   {"web":{"project":"https://www.url3.com", "color":"white"} ...}  red

1。Series.str.extract

如果bucket列中的值属于string类型,我们可以将extractregex模式一起使用

df['color'] = df['bucket'].str.extract(r'"color":"([^"]+)"', expand=False)

2.Series.str.get

否则,如果列bucket中的值属于dict类型,则可以使用str.get

df['color'] = df['bucket'].str.get('page').str.get('color')

>>> df
id   name                                                   bucket  color
0  11324  Soaps  {"page":{"url":"https://www.url.com", "color":"white"}}  white
0  11325   Cans  {"page":{"url":"https://www.url.com", "color":"black"}}  black
0  11326  Boxes    {"page":{"url":"https://www.url.com", "color":"red"}}    red

只需使用eval()方法和apply()方法:

df['bucket']=df['bucket'].apply(lambda x:eval(x))

现在终于:

df['color']=df['bucket'].apply(lambda x:list(x.values())[0]['color'])

现在,如果你打印df,你会得到你想要的输出:

id      name    bucket.                                                          color
0   11324   Soaps   {"web":{"project":"https://www.url1.com", "color":"white"} ...}  white
0   11325   Cans    {"web":{"project":"https://www.url2.com", "color":"white"} ...}  black
0   11326   Boxes   {"web":{"project":"https://www.url3.com", "color":"white"} ...}  red

最新更新