我发现很难用正确的词语来表达问题。但我希望我做得很好......
以下是我人工创建的示例,您可以在控制台中重现它。
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)
DataFrame example
的第二列是嵌套字典结构列表。
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'}}]]]
这是我使用0
打印的名为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中,而不是{{1或者None
!此外,您现在看到的第二列有一个键NaN
,其中有一个嵌套(键,值)对,我想作为单独的列{ {1}},a2
键,值对。
amount
到目前为止我做了什么?
我很惭愧地说我不知道从哪里开始..
以上示例是我从JSON文件(300 MB)派生的PANDas DataFrame的更小版本。我最初,不必要地花了很多时间创建嵌套字典结构,然后解压缩复杂的嵌套字典,发现从JSON创建DataFrame的命令是currency
..
答案 0 :(得分:0)
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)