python - 根据 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 文件作为参考。
任何帮助将不胜感激。
解决方案
设置
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 -
推荐阅读
- python - 元组内部的元组问题
- c++ - 可能的指针错误无法从 type1 转换为 type 2
- php - 用户在时事通讯表单中提交他们的电子邮件地址后,我如何自动发送电子邮件?
- amazon-web-services - 如何使用 AWS 资源管理器下载和编辑 lambda
- woocommerce - 在 Woocommerce 中隐藏侧边栏
- alfresco - 如何在露天覆盖 ftl
- sql - SQL 查找特定节点并将其值 (json) 作为 excel 格式的结果返回
- reactjs - 谷歌地图 API 与 React
- python - 如何在python pandas中传递日期参数来执行sql存储过程
- python - 如何使用 beautifulsoup 从 banggood.com 获取运费