首页 > 解决方案 > 根据 JSON 中的字符串匹配创建一个新的 Pandas 列

问题描述

我有一个数据框:

df =
     SomeText
0    foo foo foo bar
1    bar foo buzz
2    bar bar bar
3    buzz buzz buzz buzzer

还有一个 JSON:

json_dict =

{
    "text": [
        {
            "notes": [],
            "code": 1,
            "word": foo,
        },
        {
            "notes": [],
            "code": 2,
            "word": bar,
        },
        {
            "notes": [buzzer],
            "code": 3,
            "word": buzz,
        }
    ]
}

我想解析列中的文本并根据存储在 JSON 中的数据SomeText附加一个新列。df如果该单词出现在字符串中,请附加代码。如果单词也与注释匹配,请附加相同的代码。

df =
     SomeText                Code
0    foo foo foo bar         1, 1, 1, 2
1    bar foo buzz            2, 1, 3
2    bar bar bar             2, 2, 2
3    buzz buzz buzz buzzer   3, 3, 3, 3
4    not in json             -

JSON 中未包含的单词无关紧要。

我在数据帧之间有一些经验,但没有使用 JSON 文件作为参考。

任何帮助将不胜感激。

标签: pythonjsonpandas

解决方案


设置

df = pd.DataFrame({'SomeText': {0: 'foo foo foo bar', 1: 'bar foo buzz', 2: 'bar bar bar', 3: 'buzz buzz buzz buzzer', 4: 'not in json  '}})
dct = {'text': [{'notes': [], 'code': 1, 'word': 'foo'}, {'notes': [], 'code': 2, 'word': 'bar'}, {'notes': ['buzzer'], 'code': 3, 'word': 'buzz'}]}

创建一个字典,将 JSON 中的单词映射到它们的值:

mapper = {i['word']: i['code'] for i in dct['text']}
# {'foo': 1, 'bar': 2, 'buzz': 3}

使用列表推导:

df['Code'] = [[mapper[i] for i in t.split() if i in mapper] or '-' for t in df.SomeText]

输出:

                SomeText          Code
0        foo foo foo bar  [1, 1, 1, 2]
1           bar foo buzz     [2, 1, 3]
2            bar bar bar     [2, 2, 2]
3  buzz buzz buzz buzzer     [3, 3, 3]
4          not in json               -

要同时使用其中的内容notes,请使用简单的 for 循环来创建新字典:

mapper = {}
for i in dct['text']:
    mapper.update({j: i['code'] for j in i['notes']})
    mapper.update({i['word']: i['code']})

                SomeText          Code
0        foo foo foo bar  [1, 1, 1, 2]
1           bar foo buzz     [2, 1, 3]
2            bar bar bar     [2, 2, 2]
3  buzz buzz buzz buzzer  [3, 3, 3, 3]
4          not in json               -

推荐阅读