以字符串形式存储在 Pandas 数据框列中的解析列表

Posted

技术标签:

【中文标题】以字符串形式存储在 Pandas 数据框列中的解析列表【英文标题】:Parsing list stored as string in Pandas dataframe column 【发布时间】:2021-10-26 20:29:50 【问题描述】:

我正在尝试使用如下所示的值解析数据框列。这是我在原始数据集上运行json_normalize 后的结果。目标是获取 'name':'Org Lvl 4' 值,这样我就可以解析得到实际的 'Org Lvl 4' 名称。

index org [dtype: Object]
0 ['name': 'Org Lvl 1', 'name': 'Org Lvl 2', 'name': 'Org Lvl 3', 'name': 'Org Lvl 4']

我读到 Pandas 将其存储为字符串而不是列表,所以我尝试了其他人的建议,即split,但我收到以下错误AttributeError: Can only use .str accessor with string values!

代码:

df['org'] = df['org'].str.split(',').str[3]

数据帧:

df = pd.DataFrame('org [dtype: Object]': 0: "['name': 'Org Lvl 1', 'name': 'Org Lvl 2', 'name': 'Org Lvl 3', 'name': 'Org Lvl 4']")

更新:

尝试此操作后,我可以为索引 0 打印“Org Lvl 4”,但现在我需要将其应用于整个列。

import ast
print(df['org'].astype(str).map(ast.literal_eval)[0][3].get('name'))

有什么想法吗?

【问题讨论】:

【参考方案1】:

我能够使用lambda解决:

df['org'] = df.apply(lambda row: list(row.org)[-1]['name'])

【讨论】:

【参考方案2】:

不是一个可靠的答案,而是提供一些东西......

查看答案:How to flatten a pandas dataframe with some columns as json?

例如:

import ast

def list_of_dicts(ld):
    '''
    Create a mapping of the tuples formed after 
    converting json strings of list to a python list   
    '''
    return dict([(list(d.values())[0], list(d.values())[0]) for d in ast.literal_eval(ld)])

df = pd.DataFrame('org [dtype: Object]': 0: "['name': 'Org Lvl 1', 'name': 'Org Lvl 2', 'name': 'Org Lvl 3', 'name': 'Org Lvl 4']")

B = pd.json_normalize(df['org [dtype: Object]'].apply(list_of_dicts).tolist()) #.add_prefix('dict_') 

print(df, '\n\n')

print(B)

>>                                  org [dtype: Object]
>> 0  ['name': 'Org Lvl 1', 'name': 'Org Lvl 2',... 


>>    Org Lvl 1  Org Lvl 2  Org Lvl 3  Org Lvl 4
>> 0  Org Lvl 1  Org Lvl 2  Org Lvl 3  Org Lvl 4

【讨论】:

以上是关于以字符串形式存储在 Pandas 数据框列中的解析列表的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何将数据框列中的“时间戳”值从对象/字符串转换为时间戳?

如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?

使用 pandas str.find 方法对数据框列中的字符串进行切片

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

检查列表中的单词并在 pandas 数据框列中删除这些单词

在 Pandas 数据框列中填充缺失的日期值