作者: bongbong3481 時間: 2023-12-1 07:03 標題: 有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
- Sub group_transpose()
- temp = Cells(1, 1)
- row_n = 2
- Count = 1
- Last_row = 7
- For i = 2 To Last_row
- If Cells(i, 1) <> temp Then
- Count = 1
- temp = Cells(i, 1)
- Cells(row_n, 4) = Cells(i, 1)
- Cells(row_n, 4 + Count) = Cells(i, 2)
- row_n = row_n + 1
-
- Else
- Count = Count + 1
- Cells(row_n - 1, 4 + Count) = Cells(i, 2)
- End If
- Next i
- End Sub
作者: pchai 時間: 2023-12-1 11:43
回覆 1# bongbong3481
要快用返pandas (code created by ChatGPT)
- import pandas as pd
- import random
- import string
- # Generating 15000 random records with letters A-Z and numbers 0-1000
- random_data = [(random.choice(string.ascii_uppercase), random.randint(0, 1000)) for _ in range(15000)]
- # Creating a DataFrame from the generated data
- df = pd.DataFrame(random_data, columns=['Letter', 'Number'])
- # Transposing the data
- grouped = df.groupby('Letter')['Number'].apply(list)
- result = pd.DataFrame(grouped.tolist(), index=grouped.index)
- # Resetting the index
- result = result.reset_index()
- # Display orginal
- print(df)
- # Display the result
- 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]
作者: bongbong3481 時間: 2023-12-3 15:04
回覆 2# pchai
我用同樣筆數測試過,好似VBA 快D ,不過pandas 寫既code是少好多 (如果識寫,我都是抄人d code)
