python - 在 Pandas 中,一个单元格的字典键、值对到名称为键、行为值的列
问题描述
我发现很难用正确的词来表达这个问题。但我希望我做得很好。
这是我人为创建的示例,因此您可以在控制台中重现它。
example = pd.DataFrame([['a', [{'a1': 1,
'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
{'a1': 4,
'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 7,
'a2': {'amount': 80, 'currency': 'USD'}}], 10, 11],
['b', [{'a1': 13,
'a2': {'amount': 140, 'currency': 'USD'}},
{'a1': 2,
'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 3,
'a2': {'amount': 90, 'currency': 'USD'}}], 16, 17],
['c', [{'a1': 8,
'a2': {'amount': 75, 'currency': 'USD'}},
{'a1': 9,
'a2': {'amount': 90, 'currency': 'USD'}, 'a3': 98},
{'a1': 6,
'a2': {'amount': 10, 'currency': 'USD'}}], 11, 12]])
example.columns = ['column1', 'column2', 'column3', 'column4']
print(example)
DataFrameexample
的第二列是类似结构的嵌套字典列表。
print(example.loc[[0], ["column2"]].values.tolist())
[[[{'a1': 1, 'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
{'a1': 4, 'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 7, 'a2': {'amount': 80, 'currency': 'USD'}}]]]
这是我使用打印的 row 0
、 column 名称。column2
loc
该print(exampleSolution)
声明应该为您提供我想要的 Pandas DataFrame。
exampleSolution = pd.DataFrame([['a', 1, 20, 'USD', 57, 10, 11], ['a', 4, 50, 'USD', None, 10, 11],
['a', 7, 80, 'USD', None, 10, 11], ['b', 13, 140, 'USD', None, 16, 17],
['b', 2, 50, 'USD', None, 16, 17], ['b', 3, 90, 'USD', None, 16, 17],
['c', 8, 75, 'USD', None, 11, 12], ['c', 9, 90, 'USD', 98, 11, 12],
['c', 6, 10, 'USD', None, 11, 12]])
exampleSolution.columns = ['column1', 'a1', 'amount', 'currency', 'a3', 'column3', 'column4']
print(exampleSolution)
基本上,我希望column2
为每一行解包里面的字典,我希望字典键是一个附加的列名,而行中的值是与该键对应的字典值。如果有某些键,其他行的值对(例如在我的示例中,我们看到0
我用来loc
打印的第一行具有此键a3
,而同一行在其嵌套的第二项和第三项中0
没有a3
字典!同样,该行在其嵌套字典的第二项中2
也有一个键a3
。同样,我希望解决方案对嵌套字典中可能存在特定键值对的情况具有鲁棒性,这在任何情况下都从未见过另一排!可能有一个a4
column2
在特定行的嵌套字典和a5
另一行的嵌套字典中,我希望这些附加列存在于结果 DataFrame 中;用一个None
或一个NaN
!此外,您现在可能已经看到的第二列有一个 key a2
,其中有一个嵌套的 (key, value) 对,我希望将其作为单独的 columns amount
、currency
key、 value 对。
column1 a1 amount currency a3 column3 column4
0 a 1 20 USD 57.0 10 11
1 a 4 50 USD NaN 10 11
2 a 7 80 USD NaN 10 11
3 b 13 140 USD NaN 16 17
4 b 2 50 USD NaN 16 17
5 b 3 90 USD NaN 16 17
6 c 8 75 USD NaN 11 12
7 c 9 90 USD 98.0 11 12
8 c 6 10 USD NaN 11 12
到目前为止我做了什么?
我很惭愧地说我不知道从哪里开始..
上面的示例是我从 JSON 文件 (300 MB) 派生的 Pandas DataFrame 的小得多的版本。最初,我不必要地花费大量时间创建嵌套字典结构,然后解压缩复杂的嵌套字典,却发现从 JSON 创建 DataFrame 的命令是pd.read_json()
..
解决方案
from pandas.io.json import json_normalize
rows = list(example.index)
mainDf = pd.DataFrame()
for index in rows:
listing = example.at[index, "column2"]
df = pd.DataFrame()
for i in listing:
l = (json_normalize(i))
df = df.append(l)
otherCols = list(example.columns)
otherCols.remove('column2')
for col in otherCols:
#print(example.loc[[index], [col]])
df[col] = example.at[index, col]
mainDf = mainDf.append(df)
print(mainDF)
推荐阅读
- java - 在 gradle 中使用 cucumber 时在运行时添加必要的库文件
- excel - 如何将具有条件格式的表格视觉对象从 Power BI 导出到 Excel?
- performance - 为什么 z3 增量性能如此糟糕?
- python - 无法构建在不规则张量上循环的 Tesnorflow 自定义层
- python-3.x - 如何退出函数
- java - 有没有办法获取传递给方法调用的值?
- python - 你如何通过 TCP/IP 逐行发送 .txt 并有一定的延迟?
- docker - Gitlab-runner 无法访问另一个 VM 中的远程 docker 守护进程
- agora.io - Agora.io websdk 示例给出错误 ERR_DYNAMIC_USE_STATIC_KE
- git - 如何在 Visual Studio Code 上更新已保存的 git 凭据