python - 在 pandas 中解析一列字符串化字典
问题描述
我有这个数据框:
df = pd.DataFrame([
{ "name": "foo", "results": "{'lower_bound': '15000', 'upper_bound': '19999'}"},
{ "name": "bar", "results": "{'lower_bound': '10000', 'upper_bound': '14999'}"}
])
目前它看起来像这样:
name results
0 foo {'lower_bound': '15000', 'upper_bound': '19999'}
1 bar {'lower_bound': '10000', 'upper_bound': '14999'}
我想将该results
列转换为结构化数据,以便过滤 df.lower_bound 小于 13000 的行。
我怎样才能做到这一点?
解决方案
这可能不是最佳或最佳方式:
from ast import literal_eval
df['results'] = df['results'].apply(lambda i: literal_eval(i))
这会将'results'
列中的字符串格式的值转换为字典。输出 :
name results
0 foo {'lower_bound': '15000', 'upper_bound': '19999'}
1 bar {'lower_bound': '10000', 'upper_bound': '14999'}
然后 :
df['results'] = df['results'].apply(lambda i: {k:int(v) for k,v in i.items()})
这会将该列中字典的值从字符串转换为整数格式。输出 :
name results
0 foo {'lower_bound': 15000, 'upper_bound': 19999}
1 bar {'lower_bound': 10000, 'upper_bound': 14999}
现在,获取字典lower_bound
键的值 < 13000 的行,即使lower_bound
任何行中都没有键,也要处理这种情况:
df.loc[map(lambda i:i.get('lower_bound', '0')<13000, df['results'])]
输出 :
name results
1 bar {'lower_bound': 10000, 'upper_bound': 14999}
推荐阅读
- python - 存储 3D 数据以在 Python 中搜索的最佳方式
- r - 如何将for循环的结果存储到数据框中
- r - 是否有一个 R 函数可以将多列转换为一列,创建另一个新列来为每个值命名?
- c# - 实施自己的身份验证/身份服务
- flutter - SingleChildScrollView 不能与列中的多个组件一起使用 - 颤动
- javascript - 如何以编程方式创建输入/输出系统?
- session - Sapper/svelte3 会话在没有页面重新加载的情况下不同步
- sql - 如何修复:Access VBA 中更新语句上的“操作必须使用可更新查询”
- r - 为特定列格式化 Flextable 中的数字
- excel - 复制过滤表