Python 来自具有嵌套列表的字典的数据帧
我有一个带有嵌套列表的python字典,我想把它变成一个数据框架Python 来自具有嵌套列表的字典的数据帧,python,pandas,Python,Pandas,我有一个带有嵌套列表的python字典,我想把它变成一个数据框架 a = {'A': [1,2,3], 'B':['a','b','c'],'C':[[1,2],[3,4],[5,6]]} 我希望最终的数据帧如下所示: > A B C > 1 a 1 > 1 a 2 > 2 b 3 > 2 b 4 > 3 c 5 > 3 c 6 pd.DataFrame(a) > A B C >0 1
a = {'A': [1,2,3], 'B':['a','b','c'],'C':[[1,2],[3,4],[5,6]]}
我希望最终的数据帧如下所示:
> A B C
> 1 a 1
> 1 a 2
> 2 b 3
> 2 b 4
> 3 c 5
> 3 c 6
pd.DataFrame(a)
> A B C
>0 1 a [1, 2]
>1 2 b [3, 4]
>2 3 c [5, 6]
当我使用DataFrame命令时,它如下所示:
> A B C
> 1 a 1
> 1 a 2
> 2 b 3
> 2 b 4
> 3 c 5
> 3 c 6
pd.DataFrame(a)
> A B C
>0 1 a [1, 2]
>1 2 b [3, 4]
>2 3 c [5, 6]
我是否通过C元素使数据变长?这就是我的想法:
In [53]: df
Out[53]:
A B C
0 1 a [1, 2]
1 2 b [3, 4]
2 3 c [5, 6]
In [58]: s = df.C.apply(Series).unstack().reset_index(level=0, drop = True)
In [59]: s.name = 'C2'
In [61]: df.drop('C', axis = 1).join(s)
Out[61]:
A B C2
0 1 a 1
0 1 a 2
1 2 b 3
1 2 b 4
2 3 c 5
2 3 c 6
apply(Series)
提供了一个包含两列的数据帧。要在保留原始索引的同时将它们合并为一个索引,我使用unstack
reset_index
删除了索引的第一级,它基本上保存了原始列表中的值的索引,该列表是C。然后我将其重新连接到df中。这就是我想到的:
In [53]: df
Out[53]:
A B C
0 1 a [1, 2]
1 2 b [3, 4]
2 3 c [5, 6]
In [58]: s = df.C.apply(Series).unstack().reset_index(level=0, drop = True)
In [59]: s.name = 'C2'
In [61]: df.drop('C', axis = 1).join(s)
Out[61]:
A B C2
0 1 a 1
0 1 a 2
1 2 b 3
1 2 b 4
2 3 c 5
2 3 c 6
apply(Series)
提供了一个包含两列的数据帧。要在保留原始索引的同时将它们合并为一个索引,我使用unstack
reset_index
删除索引的第一级,它基本上保留了原始列表中的值的索引,该列表是C。然后我将其重新加入到df中。是的,一种方法是首先处理你的字典(我假设您的词汇值包含值列表或嵌套列表,但不包含值列表和列表)。
逐步:
def f(x, y): return x + y
res={k: reduce(f, v) if any(isinstance(i, list) for i in v) else v for k,v in a.items()}
将为您提供:
{'A':[1,2,3],'C':[1,2,3,4,5,6],'B':['A','B','C']}
现在,您需要在词汇表中扩展列表:
m = max([len(v) for v in res.values()])
res1 = {k: reduce(f, [(m/len(v))*[i] for i in v]) for k,v in res.items()}
最后:
pd.DataFrame(res1)
是的,一种方法是首先处理你的词汇表(我假设你的词汇表值要么只包含值列表,要么包含嵌套列表,但不包含值和列表的列表)。 逐步:
def f(x, y): return x + y
res={k: reduce(f, v) if any(isinstance(i, list) for i in v) else v for k,v in a.items()}
将为您提供:
{'A':[1,2,3],'C':[1,2,3,4,5,6],'B':['A','B','C']}
现在,您需要在词汇表中扩展列表:
m = max([len(v) for v in res.values()])
res1 = {k: reduce(f, [(m/len(v))*[i] for i in v]) for k,v in res.items()}
最后:
pd.DataFrame(res1)
你的“盒子外”是什么样子:)你的“盒子外”是什么样子:)