我是Python的新手,在寻找了一段时间之后,我仍然无法找到解决我问题的好方法。 我正在尝试根据词典列表创建Pandas数据框。
我的嵌套词典列表如下:
def column_check(list1,list2):
for word in list2:
if word in list1:
return 1
return 0
print(column_check(list1, list2)
我的输出应该是
{'category_1': [{'a': '151',
'b': '116',
'c': '86'}],
'category_2': [{'d': '201',
'e': '211',
'f': '252'},
{'d': '-1',
'e': '-9',
'f': '-7'}],
'category_3': {'g': 'Valid',
'h': None,
'i': False,
'j': False},
'category_4': {'k': None,
'l': None,
'm': None,
'n': None}}
我尝试过的 我可以做1、3、4类,但不知道第二类 我尝试了concat并进行了嵌套循环获取
a b c d e f g h i j k l m n
0 151 116 86 201,-1 211,-9 252,-7 valid None False False None None None None
然后将其合并。 如我所说,无法整体弄清楚!
答案 0 :(得分:2)
我写了一个简短的递归函数,它返回一个序列,或者如果您的字典中的一个键(例如category_2
)包含多个字典的列表,则返回多个序列的串联。
def expand(x):
if type(x) == dict:
return pd.Series(x)
elif type(x) == list:
return pd.concat([expand(i) for i in x])
如果我从上面示例中粘贴的字典开始:
d = {'category_1': [{'a': '151',
'b': '116',
'c': '86'}],
'category_2': [{'d': '201',
'e': '211',
'f': '252'},
{'d': '-1',
'e': '-9',
'f': '-7'}],
'category_3': {'g': 'Valid',
'h': None,
'i': False,
'j': False},
'category_4': {'k': None,
'l': None,
'm': None,
'n': None}}
然后只需将我编写的递归方法创建的所有系列连接起来即可。
output = pd.concat([expand(value) for key, value in d.items()])
并合并所有重复的索引,以便它们的项显示在一行中并用逗号分隔。我还将该系列重塑为具有一行和几列的df:
output = pd.DataFrame(output.groupby(output.index).apply(lambda x: ','.join(x.astype(str)))).T
这将导致数据框与您所需的输出相匹配:
output
a b c d e f g h i j k l m n
0 151 116 86 201,-1 211,-9 252,-7 Valid None Invalid Invalid None None None None
答案 1 :(得分:1)
下面的代码递归地尝试展平可以包含列表或其他字典的输入结构。当它碰到叶子时,将内容添加到平坦的字典中,然后将其转换为数据框。
flattened_dict = {}
def flatten(obj, name = ''):
if isinstance(obj, dict):
for key, value in obj.items():
flatten(obj[key], key)
elif isinstance(obj, list):
for e in obj:
flatten(e)
else:
if obj == 'null':
obj = None
flattened_dict[name] = [obj]
flatten(eg1)
请注意,您必须将null定义为字符串。原始字典的定义是:
eg1 = {
"my_list": {
"category_1": [
{
"a": "151",
"b": "116",
"c": "86"
}
],
"category_2": [
{
"d": "201",
"e": "211",
"f": "252"
},
{
"d": "-1 ",
"e": "-9",
"f": "-7"
}
],
"category_3": {
"g": "Valid",
"h": "null",
"i": "Invalid",
"j": "Invalid"
},
"category_4": {
"k": "null",
"l": "null",
"m": "null",
"n": "null"
}
}
}