首页 > 解决方案 > 在 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 的行。

我怎样才能做到这一点?

标签: pythonpandas

解决方案


这可能不是最佳或最佳方式:

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}

推荐阅读