Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使用for循环的情况下将包含等长列表的字典列表转换为数据帧_Python_Python 3.x_Pandas_Dataframe_Dictionary - Fatal编程技术网

Python 如何在不使用for循环的情况下将包含等长列表的字典列表转换为数据帧

Python 如何在不使用for循环的情况下将包含等长列表的字典列表转换为数据帧,python,python-3.x,pandas,dataframe,dictionary,Python,Python 3.x,Pandas,Dataframe,Dictionary,我有一个由列表组成的字典列表(见下面的示例代码)。我想做的是在不使用for循环的情况下创建一个数据帧。任何其他更快的方法都很好 ls = [ dict[lists], dict[lists], ... ] 起初,我只是在字典列表中循环,在列表理解中调用dataframe对象,然后将它们连接起来。请参阅下面的代码。但就我拥有的词典数量而言,这是相当缓慢的 temp_data_m1 = [{'x': np.random.rand(9).tolist(), 'y': np.random.rand(9

我有一个由列表组成的字典列表(见下面的示例代码)。我想做的是在不使用for循环的情况下创建一个数据帧。任何其他更快的方法都很好

ls = [ dict[lists], dict[lists], ... ]
起初,我只是在字典列表中循环,在列表理解中调用dataframe对象,然后将它们连接起来。请参阅下面的代码。但就我拥有的词典数量而言,这是相当缓慢的

temp_data_m1 = [{'x': np.random.rand(9).tolist(), 'y': np.random.rand(9).tolist(), 'z': np.random.rand(9).tolist()}]*50    
data_reshuffled1 = pd.concat([pd.DataFrame(dict_) for dict_ in temp_data_m1]).reset_index()

有没有一种方法可以在不使用for循环的情况下更快地实现这一点?

您可以使用字典理解中的嵌套列表理解来首先转换原始数据。这假设
temp_data_m1
中的每个项都有相同的字典键

# Sample data.
temp_data_m1 = [
    {'x': np.random.rand(3).tolist(), 
     'y': np.random.rand(3).tolist(), 
     'z': np.random.rand(3).tolist()}] * 2   

cols = temp_data_m1[0].keys()
df = pd.DataFrame(
    {col: [val for group in temp_data_m1 for val in group[col]] 
     for col in cols}
)
>>> df
          x         y         z
0  0.348319  0.404375  0.817278
1  0.887448  0.438613  0.368390
2  0.971582  0.533209  0.119674
3  0.348319  0.404375  0.817278
4  0.887448  0.438613  0.368390
5  0.971582  0.533209  0.119674
时间安排
我认为您仍然需要循环,但是使用本机列表和字典消除了pd.DataFrame/concat开销,并且速度会明显加快

x_li = []
y_li = []
z_li = []

for l in ls: 
    x_li = x_li + l[0]['x']
    y_li = y_li + l[0]['y']
    z_li = z_li + l[0]['z']

dt = {'x': x_li, 'y': y_li, 'z': z_li}

df = pd.DataFrame(data=dt)

print(df)

           x         y         z
0   0.407243  0.064404  0.994289
1   0.778702  0.689556  0.246598
2   0.222480  0.236671  0.792531
3   0.114732  0.517506  0.901426
4   0.535884  0.138807  0.034585
5   0.621681  0.963316  0.628685
6   0.643132  0.994186  0.084340
7   0.167652  0.430170  0.344222
8   0.212579  0.649676  0.231918
9   0.704128  0.509263  0.047317
10  0.409379  0.939604  0.749458
11  0.029804  0.909334  0.520931
12  0.090505  0.834817  0.603464
13  0.837209  0.394173  0.877899
14  0.344467  0.602398  0.791664
15  0.077600  0.160189  0.237363
16  0.814201  0.104583  0.428033
17  0.899438  0.498138  0.855949
18  0.713373  0.732715  0.508276
19  0.211193  0.471923  0.526867
20  0.548586  0.136339  0.863532
21  0.041740  0.315708  0.116254
22  0.943269  0.056732  0.498985
23  0.085343  0.242628  0.039939
24  0.070387  0.114533  0.790064
25  0.568233  0.323008  0.811011
26  0.704781  0.221614  0.496521
27  0.089998  0.395631  0.703831
28  0.097087  0.012521  0.863149
29  0.731969  0.736039  0.147671
30  0.068417  0.117126  0.503902
31  0.487064  0.869781  0.677574
32  0.340297  0.633361  0.277859
33  0.141047  0.419666  0.193531
34  0.295001  0.845972  0.473824
35  0.217506  0.011523  0.717565
36  0.497627  0.059094  0.052230
37  0.658364  0.645356  0.712826
38  0.485345  0.600351  0.346634
39  0.395588  0.513874  0.797076
40  0.864188  0.786392  0.279711
41  0.979751  0.256491  0.305805
42  0.454343  0.954908  0.636447
43  0.279274  0.826389  0.891240
44  0.226816  0.222137  0.665129

你是说你不想循环是因为你认为不循环会更快吗?你是在每个连续的字典中添加更多的行还是更多的列?最后的df是什么样子的?@Jacob我认为有一个更好更快的功能可以实现this@run-如果你必须访问集合中的每一项,假设你不打算使用低级的
iter
next
功能,那么你必须循环。(我在“循环”的定义中包括了列表comp和while循环。)是的。这种方法是迄今为止所建议的方法中最快的一种。我想我会坚持这个。谢谢@Alexander
x_li = []
y_li = []
z_li = []

for l in ls: 
    x_li = x_li + l[0]['x']
    y_li = y_li + l[0]['y']
    z_li = z_li + l[0]['z']

dt = {'x': x_li, 'y': y_li, 'z': z_li}

df = pd.DataFrame(data=dt)

print(df)

           x         y         z
0   0.407243  0.064404  0.994289
1   0.778702  0.689556  0.246598
2   0.222480  0.236671  0.792531
3   0.114732  0.517506  0.901426
4   0.535884  0.138807  0.034585
5   0.621681  0.963316  0.628685
6   0.643132  0.994186  0.084340
7   0.167652  0.430170  0.344222
8   0.212579  0.649676  0.231918
9   0.704128  0.509263  0.047317
10  0.409379  0.939604  0.749458
11  0.029804  0.909334  0.520931
12  0.090505  0.834817  0.603464
13  0.837209  0.394173  0.877899
14  0.344467  0.602398  0.791664
15  0.077600  0.160189  0.237363
16  0.814201  0.104583  0.428033
17  0.899438  0.498138  0.855949
18  0.713373  0.732715  0.508276
19  0.211193  0.471923  0.526867
20  0.548586  0.136339  0.863532
21  0.041740  0.315708  0.116254
22  0.943269  0.056732  0.498985
23  0.085343  0.242628  0.039939
24  0.070387  0.114533  0.790064
25  0.568233  0.323008  0.811011
26  0.704781  0.221614  0.496521
27  0.089998  0.395631  0.703831
28  0.097087  0.012521  0.863149
29  0.731969  0.736039  0.147671
30  0.068417  0.117126  0.503902
31  0.487064  0.869781  0.677574
32  0.340297  0.633361  0.277859
33  0.141047  0.419666  0.193531
34  0.295001  0.845972  0.473824
35  0.217506  0.011523  0.717565
36  0.497627  0.059094  0.052230
37  0.658364  0.645356  0.712826
38  0.485345  0.600351  0.346634
39  0.395588  0.513874  0.797076
40  0.864188  0.786392  0.279711
41  0.979751  0.256491  0.305805
42  0.454343  0.954908  0.636447
43  0.279274  0.826389  0.891240
44  0.226816  0.222137  0.665129