如何有效地从大型数据框字典中提取同一列? (性能警告)

Posted

技术标签:

【中文标题】如何有效地从大型数据框字典中提取同一列? (性能警告)【英文标题】:How to extract the same column from a large dictionary of dataframes efficiently ? (PerformanceWarning) 【发布时间】:2021-11-16 16:10:47 【问题描述】:

下面给出了为本示例计算数据框字典的代码:

import pandas as pd
import numpy as np
import random
from datetime import datetime

# Generate the large dictionary of dataframes
dic = 

index = pd.date_range(datetime.strptime('01/01/2021', '%d/%m/%Y'), periods=100).tolist()

for i in np.arange(0,1000):

    # Initialise data:
    data = 'col1':random.sample(range(0, 100), 100),
            'col2':random.sample(range(0, 100), 100),
            'col3':random.sample(range(0, 100), 100),
            'desired_col':random.sample(range(0, 100), 100),
            'coln':random.sample(range(0, 100), 100),
           

    # Create DataFrame
    df = pd.DataFrame(index = index, data = data)
    
    dic['df'+str(i)] = df

--> 我现在有一个包含 df0、df1、df2、dfn... 等的字典,其中包含所有唯一数据,但具有相同的列名和索引。

我的目标是从所有这些 dfs 中过滤/提取同一列并将其保存到最终数据框中。

我的临时解决方案是在键周围使用 for 循环:

# Generate the new df's index
df_filtered = pd.DataFrame(index=dic[list(dic.keys())[0]].index)

for key in list(dic.keys()):
            
            # Extract the df of the dictionary
            df_i = dic[key].copy()
            
            # Save the relevant column into the final df
            df_filtered[key] = df_i[['desired_col']].copy()

但我收到了 PerformanceWarning: PerformanceWarning:DataFrame 高度分散。这通常是多次调用frame.insert的结果,性能较差。考虑改用 pd.concat。

我相信会有更优雅的方式来完成同样的任务。

非常感谢。

【问题讨论】:

【参考方案1】:

你可以使用.concat + .unstack:

df = pd.concat(dic)
print(df["desired_col"].unstack(level=0))

打印:

            df0  df1  df2  df3  df4  df5  df6  df7  df8  df9  df10  df11  df12  df13  df14  df15  df16  df17  df18  df19  df20  df21  df22  df23  df24  df25  df26  df27  df28  df29  df30  df31  df32  df33  df34  df35  df36  df37  df38  df39  df40  df41  df42  df43  df44  df45  df46  df47  df48  df49  df50  df51  df52  df53  df54  df55  df56  df57  df58  df59  df60  df61  df62  df63  df64  df65  df66  df67  df68  df69  df70  df71  df72  df73  df74  df75  df76  df77  df78  df79  df80  df81  df82  df83  df84  df85  df86  df87  df88  df89  df90  df91  df92  df93  df94  df95  df96  df97  df98  df99  df100  df101  df102  df103  df104  df105  df106  df107  df108  df109  df110  df111  df112  df113  df114  df115  df116  df117  df118  df119  df120  df121  df122  df123  df124  df125  df126  df127  df128  df129  df130  df131  df132  df133  df134  df135  df136  df137  df138  df139  df140  df141  df142  df143  df144  df145  df146  df147  df148  df149  df150  df151  df152  df153  df154  df155  df156  df157  df158  df159  df160  df161  df162  df163  df164  df165  df166  df167  df168  df169  df170  df171  df172  df173  df174  df175  df176  df177  df178  df179  df180  df181  df182  df183  df184  df185  df186  df187  df188  df189  df190  df191  df192  df193  df194  df195  df196  df197  df198  df199  df200  df201  df202  df203  df204  df205  df206  df207  df208  df209  df210  df211  df212  df213  df214  df215  df216  df217  df218  df219  df220  df221  df222  df223  df224  df225  df226  df227  df228  df229  df230  df231  df232  df233  df234  df235  df236  df237  df238  df239  df240  df241  df242  df243  df244  df245  df246  df247  df248  df249  df250  df251  df252  df253  df254  df255  df256  df257  df258  df259  df260  df261  df262  df263  df264  df265  df266  df267  df268  df269  df270  df271  df272  df273  df274  df275  df276  df277  df278  df279  df280  df281  df282  df283  df284  df285  df286  df287  df288  df289  df290  df291  df292  df293  df294  df295  df296  df297  df298  df299  df300  df301  df302  df303  df304  df305  df306  df307  df308  df309  df310  df311  df312  df313  df314  df315  df316  df317  df318  df319  df320  df321  df322  df323  df324  df325  df326  df327  df328  df329  df330  df331  df332  df333  df334  df335  df336  df337  df338  df339  df340  df341  df342  df343  df344  df345  df346  df347  df348  df349  df350  df351  df352  df353  df354  df355  df356  df357  df358  df359  df360  df361  df362  df363  df364  df365  df366  df367  df368  df369  df370  df371  df372  df373  df374  df375  df376  df377  df378  df379  df380  df381  df382  df383  df384  df385  df386  df387  df388  df389  df390  df391  df392  df393  df394  df395  df396  df397  df398  df399  df400  df401  df402  df403  df404  df405  df406  df407  df408  df409  df410  df411  df412  df413  df414  df415  df416  df417  df418  df419  df420  df421  df422  df423  df424  df425  df426  df427  df428  df429  df430  df431  df432  df433  df434  df435  df436  df437  df438  df439  df440  df441  df442  df443  df444  df445  df446  df447  df448  df449  df450  df451  df452  df453  df454  df455  df456  df457  df458  df459  df460  df461  df462  df463  df464  df465  df466  df467  df468  df469  df470  df471  df472  df473  df474  df475  df476  df477  df478  df479  df480  df481  df482  df483  df484  df485  df486  df487  df488  df489  df490  df491  df492  df493  df494  df495  df496  df497  df498  df499  df500  df501  df502  df503  df504  df505  df506  df507  df508  df509  df510  df511  df512  df513  df514  df515  df516  df517  df518  df519  df520  df521  df522  df523  df524  df525  df526  df527  df528  df529  df530  df531  df532  df533  df534  df535  df536  df537  df538  df539  df540  df541  df542  df543  df544  df545  df546  df547  df548  df549  df550  df551  df552  df553  df554  df555  df556  df557  df558  df559  df560  df561  df562  df563  df564  df565  df566  df567  df568  df569  df570  df571  df572  df573  df574  df575  df576  df577  df578  df579  df580  df581  df582  df583  df584  df585  df586  df587  df588  df589  df590  df591  df592  df593  df594  df595  df596  df597  df598  df599  df600  df601  df602  df603  df604  df605  df606  df607  df608  df609  df610  df611  df612  df613  df614  df615  df616  df617  df618  df619  df620  df621  df622  df623  df624  df625  df626  df627  df628  df629  df630  df631  df632  df633  df634  df635  df636  df637  df638  df639  df640  df641  df642  df643  df644  df645  df646  df647  df648  df649  df650  df651  df652  df653  df654  df655  df656  df657  df658  df659  df660  df661  df662  df663  df664  df665  df666  df667  df668  df669  df670  df671  df672  df673  df674  df675  df676  df677  df678  df679  df680  df681  df682  df683  df684  df685  df686  df687  df688  df689  df690  df691  df692  df693  df694  df695  df696  df697  df698  df699  df700  df701  df702  df703  df704  df705  df706  df707  df708  df709  df710  df711  df712  df713  df714  df715  df716  df717  df718  df719  df720  df721  df722  df723  df724  df725  df726  df727  df728  df729  df730  df731  df732  df733  df734  df735  df736  df737  df738  df739  df740  df741  df742  df743  df744  df745  df746  df747  df748  df749  df750  df751  df752  df753  df754  df755  df756  df757  df758  df759  df760  df761  df762  df763  df764  df765  df766  df767  df768  df769  df770  df771  df772  df773  df774  df775  df776  df777  df778  df779  df780  df781  df782  df783  df784  df785  df786  df787  df788  df789  df790  df791  df792  df793  df794  df795  df796  df797  df798  df799  df800  df801  df802  df803  df804  df805  df806  df807  df808  df809  df810  df811  df812  df813  df814  df815  df816  df817  df818  df819  df820  df821  df822  df823  df824  df825  df826  df827  df828  df829  df830  df831  df832  df833  df834  df835  df836  df837  df838  df839  df840  df841  df842  df843  df844  df845  df846  df847  df848  df849  df850  df851  df852  df853  df854  df855  df856  df857  df858  df859  df860  df861  df862  df863  df864  df865  df866  df867  df868  df869  df870  df871  df872  df873  df874  df875  df876  df877  df878  df879  df880  df881  df882  df883  df884  df885  df886  df887  df888  df889  df890  df891  df892  df893  df894  df895  df896  df897  df898  df899  df900  df901  df902  df903  df904  df905  df906  df907  df908  df909  df910  df911  df912  df913  df914  df915  df916  df917  df918  df919  df920  df921  df922  df923  df924  df925  df926  df927  df928  df929  df930  df931  df932  df933  df934  df935  df936  df937  df938  df939  df940  df941  df942  df943  df944  df945  df946  df947  df948  df949  df950  df951  df952  df953  df954  df955  df956  df957  df958  df959  df960  df961  df962  df963  df964  df965  df966  df967  df968  df969  df970  df971  df972  df973  df974  df975  df976  df977  df978  df979  df980  df981  df982  df983  df984  df985  df986  df987  df988  df989  df990  df991  df992  df993  df994  df995  df996  df997  df998  df999
2021-01-01   82   26   60    7   21   85   78   98   67   45    24    53    29    61    47    86    89    55    95    95    26    47    57     6    44    81    98    48    48    65    91    11    54    58    74    88    62    55    73    36    67    81    46    36    18    21    65    32    33    61     0    57    81    71    42    98    82     9    16    54    91    41    80    83    24    52    65    86     5    67    17    86    56    36    44    88    34    14     3    63    11    36    54    44    88    98    85    15    95    35    31     1     9    94    35    63     0    86    13    22     73     80     79     90     26     79     79     46      3     97     19     35     11     20     84     16     83     11     93     26     43     49     18     38     12     41     35     12     73     11     17     78     45     29     13     15     29     52     70     58     30     29      2     81     32      5     84     91     28     81     85     77     59     11     61     45     11     97     36     10     77     84     26     93     56     60     12     36     47     42     73     65     47     79     86     51     32     77     99     58     99     19     38     88     40     49     66     82     13     97     23     65      4     75     63     18     35     48      1      6     37     82     55     96     93     93      5     67     42     51     57     75     72     59     55     40      5     93     35     62     67     29     41     39     54     96     98     75     96      1     55     27     51     16     88     28     78     31     24     54     88     27     67     94     34     83      4     30     92     85      4     30     24     76     60      9     86     38     87     31     40     15     13     99     51      3     94     98     24      6     11     85     57     32     41      3     56     31     24     17     33     99     32     39     22     42     40     30     35     61      3     96     25     35     83     77     79     64     79     60     36     57     97      6     42     11     55     97     25      2     28     86     30     84     24     72     54     86     61     35     65     65     38     67     58     39     39     81     43     63     91     68      7     35     27     21     60     95     79     16     71     84     99     25     97     42     39     64      8     40     19     31      6     84     69     49     48     15     78     46     28     66     97     81     97     26     29     60     96     52     90      9     48     39     74     52     76     97     78      8     96      6     60     34     11     88     66      8     57     66     11     35     64     59     25     53     56     90     60     35     29     81     74     18     39     23     82     75     28     23     34     18     78     75     30     25     41     62     66      9      6     63     79     21     67     22     78     90     59     11     76     85     50     45     25     64     84     98     11     12     62     41     90     89     11     18     71      4     31     56     96     48     31     13     12     54     70     52     91      3      3      5     95     24     16     81     88     10     97     71     80     58     19     62     79     31     42     44     73     21     63     56     15     15     79     31      8     43      5     55     28     23     23     32     74     85     44     88     96     39     77     41     44     64     26     60     56     53     31     30     35     24     32     50     49     35     89     79     87     38     42     64     21     62     56     91     47     78     23     75     89     54     66     38     60     88     25     28     83     74     11     87     11     78     25     41     46     58     59     39     39     67     42     52     27      2     20     21     17     72     59     92     66     32      0     39     81     93     17     82     12     20     64     67     93     78     72     80     53     14     74     78      9     76      5     29     57     68     67     40     20     74      0     13     70      2     41     41      5     29     83     10     43     19     55     10     66     68     92     64     16     59     36     70     14     62     97     28     66     84     69     70     76     43     32     33      0     52     62     88     38     58      5     10     56     16     19     70     45      7     50     15     44     29     37      5     50     84      1     90     48     25     41      4     50     47     77     43     42     31     32     55     24     13     52     67     44     87     22     53     11     80     89     45     86     38     90      9     88     96     48     59     37     22     59     76     99     54     98     30     99     96     77     94     46     31     25     25     99     74     72     37     95     14     58     74     82     34     52     28     19     53     55     28     62     60     98     53     38      1     24     87     84     12     56     83     87     20      7     85     11     46     37     47     99     61     49      0     17     90     47     50     13     32     57     87     27     51     42      6     82     75     78     61     49     55     36     47     59     77     20     62     10     45     58     50     70     24     80     67     43     65     32     94     45     27     17     27     29     21     97      5     15     80     95     58      0      5     90     28     96      3     38     48     93     51     44     70     85     85     72     35     25     69     25     54     58     38     58     51      7     30     65     13     57     35      9     73     80      7     66     78     46     46      0     41     41     29     72     34     61     52     84     25     86     92     13     56     67     44     59     18     29     52     54     54     76     67     98     53     83     63     14     93     20     54     35     18     69     52     31     54     83     93     92     41     75     34     45     95     27     94     22      1     56     90     80     58     39     16     73     64     15     53     96     91     37     65     13     86      0     89     42     93      7     11     22     16     14     65     61     39     20     96     84     73     57     64      2     69     51     30     93     70     70     11     13     23     12     93     73     82     42     37     79     45     36     11     21     23     81     46     95     55     51     32     37      4      8     92     13     39     56     94     57     81     55     90     54     94     25      5     61      7     91     47     23     80     42     33     26     18     63     70     87     99     27     46     65     74     10     72      8     32     23     86     88     86      6     97     29     33     50     41     40      1     13     53     53      3     15     45     29     83     13     42     55     34     50     39
2021-01-02   46   77   94   40   15   39   79   69   94   11    60    39     1    57    50    81    23    52    72     6    37    10    32    76    92    53     9    20    46    87    36    64    94    25    32    35    17    71    89    28    47    21    85    71    72    69    49    46    80    20    95    61    68    89    93    41    86    54    81    29    79    77    22    52    97     9    63    60    66    47    60    49     1    48    76    32    52    51    30    69    16    54    15    89    10    29    96    16    52    66    49    87    97    82    60    56    93    80    69    52     40     33      1     63     82     88     91     55     61     59     68     77     12     93     47     70     24     76      3      7     32      8     75     81     58     83     49     75     58     22     32     53     30     71     35     28     17      3     95     17     32     38     80     39     24     76     99     46     82     42     68      7     19     80     52     10      8     82     34     13     39     66      8      9     28     78     98     12     58     69     52     96     54     10     55     30     96     74     16     74     29     61     10      8     99     86     64      1     26     38     38     38     67     33     15      0     39     99     84      8     17     78     99      4     27     27     97     77      0     98     72     76     32      2     98     93      3     61     43     41     37      1     77     12     49     47     46     29     83     14     54     35     95     39     23     41     64     27     62     89     54     54     76      8     21     13     24     62     48     76     18     64     22     36     87     25     65     34     89     97     86     35     78     44     95     90     43     93     51     19     29     10     17     97     80     33     97     20     76     62     52     76     46     45     99      6     86     11     59     77     10     26     90     71      9     28     52     57      4     81     81     76     51     75     52     33     86     17     10     55     44     20     97     28     11      6     15     35     35     97     79      4     95     36     71      5      0     79     39     32     37     73     89      5     16     28     22     61     36     44     85     91     84     10     85     66     34      2     80     68     52     43     17     40     20     45     85     75     27     92     60     87     76     74     19     61     97     50     11     90     54     25     21     32     48     38     29     16     16     31     31     61     78     35     12     78     84     39     86     40     55     93     40     42     65     65     41     80     90     99     51     52     11     34      0     50     49     69     19     62     51     37     42     88     64     24     74     63     60     75     63     57     80     60     26     84     33     96      8     46      1     35     83     60     45      9     69     67     94     75      1     82     15     64      2      5      2     59     68     86     89     73     74     38     85     56     43      6     95     42     51     73      4     97     91     23     13     92     60     63     56     56      8     70     31     63     87      3     55     76     46     69     32     79     72     80     66     93     26     82     22     71     76     14      8     43     96     37     90     28     15     48     41      7      8     17     25     78     90      9      3      6     16     10     26     91     76     58     61      5     78     82     48     89     38     62     58     94     25     11     28     16     13     80     86      8     35     85     90     27     84     95     77     35     63     56     86     50      1     14     86      5     53     60     77     69     74      6     31     94     43     74     99     75     43     75     40     55      1     78     57     27     56     36     31     41     25     17     51     90     82     76     25     79     63      8     10      1     29     46     81     89      2      9     37     85     59     40     13     55     74     78     30     93     29     64     31     36     87     51     98     42     18     25     26     22     76     94     65     56     68      6     43     16     63      2     93     77     74      0     17     37     32     70     33     40     13     44     41     28      3     56     11     57     65     53     69     24     86     31     37     80     50     74     91      6     37     18     79     62     65      8     80     29     38     86     26     59     65     84     23     90     16     63     98     61     65     51     39     26      9     94     41     89     71     78     23     95     90     91     88     63     19      2     24     28     89     26     64     80     73     51     84     93     61     62     98     10     28     81      6     52     79     52     13     25     83     50     68     68     61      1     83     92     18     19     60     22     33     98     17     56      3     80     70     97     24     81      3     69      1     47     92     52     46     10     33     13     85     80     89     16     67     49     61     95     69     25     63     56     88     15      6     57     13     55     95     25     32     53     97     34     76     50     99     81     42     86     38     43     12     87     76     84     29     29     93     43     96     92      6     14     69     40     91     46     51     55     28     14     36     17      0     24      4     39     61     18     51     86     94     33     71     64     52     68     12     46     97     17     97     46     18     55     50     82     97      5     97     58     95     97     73     19     23     11     36     14     55     35      0     42     51     14     15      5      6     34     82     34     27     27     88     64     61     35     51      3     72     27     11     27     77     19     67     27     87     25     50     87     66     60     63     77     31     36     77      0     15     84     71     79     93     81     33     25     90     72     77      8     98     50     71     52     36     10     67     72     18     94     89      0     33     26     79     12     36     95     22     26     27     97     41     16      3     49      2     76     53     47     76     33     92     63     99     19     10     96      7     35     92     99     87      6     52      3      8     80     77     48     66     60      1      6     13     85      2      4     79     33     37     79     65     55     72     95      9     18     44     86     14     23     44     72     73     97     85     97     97     75     86     32     26      9     42     34     79     83     55     10     31     69     29      9      7     70     14     46      2     73     86     29     74      4     49     95     91     73     43     27

...

【讨论】:

【参考方案2】:

类似的东西怎么样:

pd.concat([i['desired_col'] for i in dic.values()], axis=1)

【讨论】:

非常感谢您的回答。看起来是在正确的轨道上。我唯一的问题是我仍然需要更正列名而不是重复的desired_col。 如果您查看我的结果,df_filtered 将字典键作为列。 已经提供了一个可靠的替代方案,但为了完整起见,您可以使用 pd.concat([i['desired_col'] for i in dic.values()], axis=1, keys = [i for i in dic.keys()]) 继续此轨道

以上是关于如何有效地从大型数据框字典中提取同一列? (性能警告)的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地从大型 Excel 文档中检索所有字符串

Python:如何快速创建仅包含大型 Excel 工作表中特定列的 pandas 数据框?

如何有效地从 Pandas 数据框移动到 JSON

如何有效地从 JSON 列中提取字段?

如果数据帧基于列值上的过滤器,则从字典中提取行数据

如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?