[心得分享] 有d情況先sorting,可以少用1個loop,做到加速效果

本帖最後由 bongbong3481 於 2023-12-3 12:01 編輯

有個excel table 1 有5萬行,要grouping 再transpose 變成table 2咁。

如果吾sorting ,寫Excel vba ,要用2個for loop ,行著好耐都未完成。 如果轉用array 可以快好多,不過都是耐。   

如果先sorting Col A ,只需要用1個for loop 就得,速度就快好多,非常快

Excel table 1
colA colB
A 1
B 3
A 2
B 4
C 6
B 5

Excel table 2
colA colB
A 1 2
B 3 4 5
C 6
  1. Sub group_transpose()
  2. temp = Cells(1, 1)
  3. row_n = 2
  4. Count = 1
  5. Last_row = 7
  6. For i = 2 To Last_row
  7.     If Cells(i, 1) <> temp Then        
  8.         Count = 1
  9.         temp = Cells(i, 1)        
  10.         Cells(row_n, 4) = Cells(i, 1)        
  11.         Cells(row_n, 4 + Count) = Cells(i, 2)               
  12.         row_n = row_n + 1      
  13.         
  14.     Else
  15.         Count = Count + 1        
  16.         Cells(row_n - 1, 4 + Count) = Cells(i, 2)
  17.     End If
  18. Next i
  19. End Sub
複製代碼

回覆 1# bongbong3481


    要快用返pandas (code created by ChatGPT)
  1. import pandas as pd
  2. import random
  3. import string

  4. # Generating 15000 random records with letters A-Z and numbers 0-1000
  5. random_data = [(random.choice(string.ascii_uppercase), random.randint(0, 1000)) for _ in range(15000)]

  6. # Creating a DataFrame from the generated data
  7. df = pd.DataFrame(random_data, columns=['Letter', 'Number'])

  8. # Transposing the data
  9. grouped = df.groupby('Letter')['Number'].apply(list)
  10. result = pd.DataFrame(grouped.tolist(), index=grouped.index)

  11. # Resetting the index
  12. result = result.reset_index()

  13. # Display orginal
  14. print(df)

  15. # Display the result
  16. print(result)
複製代碼
      Letter  Number
0          M     429
1          U     693
2          C     156
3          N     225
4          P     558
...      ...     ...
14995      H     556
14996      T     986
14997      A     978
14998      N     735
14999      W      23

[15000 rows x 2 columns]
   Letter    0    1    2    3    4    5    6    7    8  ...    615    616  \
0       A  158  214  833  914  129   60  201   48  588  ...    NaN    NaN   
1       B  258  880  214  931  538   70  400  104  563  ...    NaN    NaN   
2       C  156  645  464  204  853  264  450   25  187  ...    NaN    NaN   
3       D  909  433  618   99  145  664  888  214  813  ...    NaN    NaN   
4       E  773  645  226  584  309  894  416   45   72  ...    NaN    NaN   
5       F  220  297  341  955  775  464  997  352  840  ...    NaN    NaN   
6       G  380  676  857   11  172  213  670  564   50  ...    NaN    NaN   
7       H  776  896  108  879   25  157  782  368   27  ...    NaN    NaN   
8       I  847   15  438  458  921  852  238  610  578  ...  603.0  360.0   
9       J  365  990  155  766  438   55  656  632  246  ...    NaN    NaN   
10      K  500  745  612   52  553   96  393  530  862  ...    NaN    NaN   
11      L  975  350  321   58  893  450  388  983  287  ...    NaN    NaN   
12      M  429  555  930  643  260  947  857  757  889  ...    NaN    NaN   
13      N  225  103  994   71  882  640  823  207  979  ...    NaN    NaN   
14      O  266    1  563  823  831  848  899  889  420  ...    NaN    NaN   
15      P  558  907  567  171  497  491  877  278  719  ...    NaN    NaN   
16      Q  480  474  533  514  817  163   54  638  102  ...  770.0  439.0   
17      R   25  391  259  352  465   91   75  616  144  ...    NaN    NaN   
18      S   44  829  158  151  494  116  624   92  764  ...    NaN    NaN   
19      T  527  228  299  834  490  784  886  393  114  ...    NaN    NaN   
20      U  693  546  729  367  902  449  817  152  772  ...    NaN    NaN   
21      V  573  522  327  986  576  734  834  603  773  ...    NaN    NaN   
22      W  874    0  164  295  170  665  518  791  664  ...    NaN    NaN   
23      X  648  771  558    9  905  807  484  805  354  ...    NaN    NaN   
24      Y  308   17   61   20  756  398  483  618  969  ...    NaN    NaN   
25      Z  819  712  142  294  998  764  551  600   15  ...    NaN    NaN   

      617    618    619   620    621    622    623    624  
0     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
1     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
2     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
3     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
4     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
5     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
6     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
7     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
8   955.0   68.0  158.0  63.0  905.0  605.0    NaN    NaN  
9     NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
10    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
11    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
12    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
13    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
14    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
15    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
16  195.0  505.0  552.0  59.0  441.0  284.0  982.0  786.0  
17    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
18    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
19    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
20    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
21    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
22    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
23    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
24    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
25    NaN    NaN    NaN   NaN    NaN    NaN    NaN    NaN  

[26 rows x 626 columns]

TOP

回覆 2# pchai

我用同樣筆數測試過,好似VBA 快D ,不過pandas 寫既code是少好多 (如果識寫,我都是抄人d code)

TOP