【问题标题】:pandas - string to list to dictionarypandas - 要列出到字典的字符串
【发布时间】:2018-09-29 08:58:27
【问题描述】:

我有以下问题,我正在尝试将 pandas df 中的字符串转换为列表,以便以后可以将它们构造为 dict。请看下面:

我的数据以字符串形式出现在 pandas df 中,即

df['users'].iloc[0] = "str1|str2, str3|str4"

.....等等系列。

我从这里拆分字符串:

df['users'] = df['users'].map(lambda x: re.split("[',|']",x)),返回一个列表[str1, str2, str3, str4]

到目前为止一切顺利。我无法解决的挑战是获取所述列表并将其构建为字典,以便我生成以下内容:

[{ field1: str1 field2: str2 field3: field4: },{ field1: str3 field2: str4 field3: field4: }]

以后可以填写空字段(可选)。

有没有更好的方法来构建数据以使这个目标更容易?即列表为[[str1, str2],[str3, str4]]

我将如何使用字段名称(field1、filed2、...)从该列表中“压缩”这些值?

本质上,最终输出应该包含原始字符串所在的df的每个单元格中的上述字典。

谁能提供见解?谢谢。

【问题讨论】:

    标签: python json pandas dictionary


    【解决方案1】:

    列表列表

    df.users.map(
        lambda s: [x.split('|') for x in s.split(', ')]
    )
    
    0    [[str1, str2], [str3, str4]]
    Name: users, dtype: object
    

    使用 f 字符串的字典

    df.users.map(
        lambda s: [
            {f'field{i}': v for i, v in enumerate(x.split('|'), 1)}
            for x in s.split(', ')
        ]
    )
    
    0    [{'field1': 'str1', 'field2': 'str2'}, {'field...
    Name: users, dtype: object
    

    带有预先确定的字段

    fields = 'field1 field2 field3 field4'.split()
    
    df.users.map(
        lambda s: [dict(zip(fields, x.split('|'))) for x in s.split(', ')]
    )
    
    0    [{'field1': 'str1', 'field2': 'str2'}, {'field...
    Name: users, dtype: object
    

    如果你想要所有字段

    from itertools import zip_longest
    
    fields = 'field1 field2 field3 field4'.split()
    
    df.users.map(
        lambda s: [dict(zip_longest(fields, x.split('|'))) for x in s.split(', ')]
    )
    

    【讨论】:

    • 这太棒了!!
    • @piRSquared 这很好,但总是有 4 个字段,我不一定需要将它们命名为 1-2,它们可以是静态的,即 Br、Ct、Ma、Ft。感谢您的帮助。
    • @piRSquared 尝试了上述方法,列表位列表工作正常,但我在预定字段部分收到以下错误:TypeError: 'dict' object is not callable
    • 您不小心用其他内容覆盖了 dict 名称。找到您分配给它的位置并更改它。如果在 Jupyter 中,请执行 del dict 然后再次尝试解决方案。
    • @piRSquared 搞定了。我会接受你的回答。非常感谢你,你是熊猫大师/熊猫大师?还有一件事,为什么 field3 和 field 4 没有出现?无论它们是否有价值,我都需要它们。我可以稍后分配它。
    【解决方案2】:

    这样的事情可能会有所帮助(假设总是有四个字段):

    import itertools
    import pprint
    
    FIELDS = [
        'field1',
        'field2',
        'field3',
        'field4',
    ]
    
    test_str = "str1|str2, str3|str4"
    items = test_str.split(',')
    results = [
        # Pads non-existent fields with `None`.
        dict(itertools.zip_longest(FIELDS, item.split('|')))
        for item in items
    ]
    
    pprint.pprint(results)
    # Returns:
    # [{'field1': 'str1', 'field2': 'str2', 'field3': None, 'field4': None},
    #  {'field1': ' str3', 'field2': 'str4', 'field3': None, 'field4': None}]
    

    【讨论】:

    • 感谢您的回答,zip_longest 技巧创造了奇迹!
    • @JohnWayne360 很高兴听到这个消息! :)
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多