In [1]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

Példa 1


In [27]:
df=pd.read_excel('formazottbi2.xlsx')

In [28]:
df


Out[28]:
Tevékenység Ország 2004 2006 2008 2010 2012 2014 2016
0 Agriculture, forestry and fishing Belgium 1 186 648 361 827 287 656 225 622 165 463 311 835 269 190
1 Agriculture, forestry and fishing Bulgária 722 228 632 966 754 286 618 107 903 119 835 401 617 689
2 Agriculture, forestry and fishing Csehország 1 244 149 315 585 254 546 113 683 196 063 135 313 114 575
3 Agriculture, forestry and fishing Dánia 24 038 27 550 40 731 189 101 75 225 117 682 201 648
4 Agriculture, forestry and fishing Németország 1 226 989 1 515 272 1 350 758 256 272 648 869 438 829 1 126 134
5 Agriculture, forestry and fishing Észtország 183 860 118 829 240 005 109 873 77 404 121 677 113 946
6 Agriculture, forestry and fishing Írország 8 706 0 19 376 101 143 96 251 96 251 ..
7 Agriculture, forestry and fishing Görögország 4 711 294 4 711 294 0 5 073 9 979 10 976 ..
8 Agriculture, forestry and fishing Spanyolország 17 986 083 15 152 405 11 355 660 5 816 630 5 496 458 5 817 439 6 271 464
9 Agriculture, forestry and fishing Franciaország 1 221 940 1 221 940 1 312 890 1 371 625 1 290 136 1 274 216 1 315 214
10 Agriculture, forestry and fishing Horvátország 121 133 72 167 18 679 14 223 75 096 269 111 496 153
11 Agriculture, forestry and fishing Olaszország 615 288 558 481 349 096 310 912 407 979 323 518 320 928
12 Agriculture, forestry and fishing Ciprus 378 416 131 541 126 651 129 184 18 203 19 856 19 453
13 Agriculture, forestry and fishing Lettország 208 465 96 126 74 660 68 024 2 767 36 209 362 303
14 Agriculture, forestry and fishing Litvánia 874 218 874 219 786 069 455 856 481 708 421 071 252 305
15 Agriculture, forestry and fishing Luxemburg 11 324 11 324 2 486 2 547 1 381 3 094 30 986
16 Agriculture, forestry and fishing Magyarország 3 999 629 1 997 533 336 865 487 655 460 047 520 961 484 315
17 Agriculture, forestry and fishing Málta 36 7 2 667 2 888 2 709 3 018 10 569
18 Agriculture, forestry and fishing Hollandia 2 392 596 2 659 520 3 468 475 4 682 517 4 618 778 4 769 683 5 085 249
19 Agriculture, forestry and fishing Ausztria 468 629 512 872 459 096 550 439 179 044 128 124 129 834
20 Agriculture, forestry and fishing Lengyelország 1 522 976 1 522 976 1 350 163 603 472 884 425 492 106 534 931
21 Agriculture, forestry and fishing Portugália 694 144 213 722 74 760 138 264 83 357 49 281 55 520
22 Agriculture, forestry and fishing Románia 21 019 098 21 019 098 19 204 236 608 062 470 756 559 573 507 712
23 Agriculture, forestry and fishing Szlovénia 76 497 214 335 132 159 141 285 164 761 102 716 62 959
24 Agriculture, forestry and fishing Szlovákia 605 600 741 965 788 788 525 604 549 391 574 396 788 559
25 Agriculture, forestry and fishing Finnország 1 537 025 2 038 408 2 738 973 2 772 031 3 157 813 4 471 0
26 Agriculture, forestry and fishing Svédország 314 317 314 317 314 314 308 946 273 071 655 374 804 382
27 Agriculture, forestry and fishing Nagy-Britannia 719 198 666 485 681 314 464 297 665 555 669 504 602 258
28 Agriculture, forestry and fishing Izland 78 559 .. .. 72 071 82 097 16 442 38 356
29 Agriculture, forestry and fishing Liechtenstein .. .. 615 306 0 0 22
... ... ... ... ... ... ... ... ... ...
360 Háztartások Franciaország 25 688 700 26 832 200 29 310 520 29 306 586 29 996 157 28 374 300 29 193 619
361 Háztartások Horvátország .. 183 162 0 0 1 190 553 1 162 112 1 144 199
362 Háztartások Olaszország 31 149 585 32 522 650 32 471 571 32 478 921 29 993 530 29 651 721 30 116 606
363 Háztartások Ciprus 367 353 356 520 432 858 461 227 369 586 323 859 394 911
364 Háztartások Lettország 543 490 853 889 606 077 694 013 1 213 193 709 118 870 177
365 Háztartások Litvánia 601 749 1 298 932 1 362 620 1 261 400 1 176 825 1 161 764 1 119 278
366 Háztartások Luxemburg 221 014 191 580 276 272 250 061 249 010 242 849 639 586
367 Háztartások Magyarország 4 442 050 2 978 311 3 466 071 2 864 896 2 680 573 2 951 303 2 886 891
368 Háztartások Málta 132 387 130 208 145 817 149 564 149 267 154 456 170 374
369 Háztartások Hollandia 9 455 209 9 416 499 9 434 770 9 084 649 8 862 530 8 523 482 8 549 762
370 Háztartások Ausztria 3 441 041 3 711 839 3 819 277 4 622 626 4 020 113 4 170 023 4 268 278
371 Háztartások Lengyelország 6 768 077 6 885 997 6 879 294 8 889 685 9 324 197 8 240 413 9 534 484
372 Háztartások Portugália 4 582 610 4 641 103 5 466 307 5 440 930 4 731 431 4 710 465 4 897 262
373 Háztartások Románia 3 638 200 6 368 670 6 503 356 5 164 479 4 525 388 3 823 053 4 098 427
374 Háztartások Szlovénia 660 980 1 088 875 714 165 727 708 641 449 562 375 642 022
375 Háztartások Szlovákia 1 475 121 1 623 306 1 772 426 1 719 012 1 656 571 1 732 983 1 889 523
376 Háztartások Finnország 1 164 497 1 191 220 1 674 400 1 680 763 1 733 525 1 602 959 1 791 659
377 Háztartások Svédország 4 079 432 4 340 669 4 393 002 4 038 272 4 193 105 4 172 574 4 410 872
378 Háztartások Nagy-Britannia 31 007 480 32 466 328 31 539 338 27 393 710 26 469 736 26 838 419 27 300 581
379 Háztartások Izland 141 487 .. .. 232 256 232 921 299 413 430 925
380 Háztartások Liechtenstein .. .. 0 0 316 274 26 988 27 167
381 Háztartások Norvégia 1 933 939 2 199 862 2 224 522 2 228 608 2 437 776 2 426 530 2 444 305
382 Háztartások Svájc .. .. .. .. .. .. ..
383 Háztartások Montenegró .. .. .. .. 0 187 289 227 055
384 Háztartások Macedónia .. .. .. 451 382 0 0 0
385 Háztartások Albánia .. .. .. .. .. .. ..
386 Háztartások Szerbia .. .. .. 0 0 1 637 251 1 589 709
387 Háztartások Törökország 29 224 710 30 081 820 28 454 025 29 587 465 30 785 436 31 230 000 27 985 092
388 Háztartások Bosznia-Hercegovina .. .. .. .. 0 .. ..
389 Háztartások Koszovó .. .. .. .. 490 045 490 045 302 741

390 rows × 9 columns

A stack egymásra rakja az oszlopokat.


In [29]:
pd.DataFrame(df.stack()).head()


Out[29]:
0
0 Tevékenység Agriculture, forestry and fishing
Ország Belgium
2004 1 186 648
2006 361 827
2008 287 656

Most nem teljesen jó, mert előbb az országot és a tevékenységet ki kellene ragadjuk onnan. Ezért indexet csinálunk belőlük.


In [30]:
df.columns


Out[30]:
Index(['Tevékenység', 'Ország', 2004, 2006, 2008, 2010, 2012, 2014, 2016], dtype='object')

In [31]:
df.set_index(['Tevékenység','Ország']).head(2)


Out[31]:
2004 2006 2008 2010 2012 2014 2016
Tevékenység Ország
Agriculture, forestry and fishing Belgium 1 186 648 361 827 287 656 225 622 165 463 311 835 269 190
Bulgária 722 228 632 966 754 286 618 107 903 119 835 401 617 689

Az eddig műveleteket memóriában végeztük. Most felülírjuk a dfet.


In [32]:
df=pd.DataFrame(df.set_index(['Tevékenység','Ország']).stack())

reset_index paranccsal újra visszatesszük az index oszlopot az adatoszlopok közé.


In [33]:
df=df.reset_index()

In [34]:
df.head()


Out[34]:
Tevékenység Ország level_2 0
0 Agriculture, forestry and fishing Belgium 2004 1 186 648
1 Agriculture, forestry and fishing Belgium 2006 361 827
2 Agriculture, forestry and fishing Belgium 2008 287 656
3 Agriculture, forestry and fishing Belgium 2010 225 622
4 Agriculture, forestry and fishing Belgium 2012 165 463

Átnevezzük az oszlopokat azzá amit szeretnénk.


In [35]:
df.columns=['Tevékenység', 'Ország','Év','Érték']

In [36]:
df.head()


Out[36]:
Tevékenység Ország Év Érték
0 Agriculture, forestry and fishing Belgium 2004 1 186 648
1 Agriculture, forestry and fishing Belgium 2006 361 827
2 Agriculture, forestry and fishing Belgium 2008 287 656
3 Agriculture, forestry and fishing Belgium 2010 225 622
4 Agriculture, forestry and fishing Belgium 2012 165 463

Az év és érték oszlopokat előbb egész számmá kell konvertáljuk plottolás előtt.


In [37]:
df['Év']=df['Év'].astype(int)

In [ ]:

A space karaktereket először ki kell cseréljük. A pandasban a replace függvény a teljes cella tartalmára vonatkozik, ezért a str.replpace-t használjuk.


In [38]:
import numpy as np

In [43]:
df['Érték']=df['Érték'].str.replace('\xa0','')\
        .str.replace('..','')
df['Érték']=df['Érték'].replace('b','').replace('e','').replace('',np.nan).astype(float)

In [44]:
df.plot(x='Év',y='Érték')


Out[44]:
<matplotlib.axes._subplots.AxesSubplot at 0x1e64283add8>

Mentés


In [45]:
df.to_excel('bi_formazott.xlsx')

In [46]:
df.to_csv('bi_formazott.csv')

Példa 2


In [47]:
dg=pd.read_csv('data_tobbacco_europe_filtered.csv')

In [48]:
dg.head()


Out[48]:
Unnamed: 0 Unnamed: 1 Daily tobacco smoking, age-standardised Daily tobacco smoking, age-standardised.1 Daily tobacco smoking, age-standardised.2 Daily cigarette smoking, age-standardised Daily cigarette smoking, age-standardised.1 Daily cigarette smoking, age-standardised.2 Current tobacco smoking, age-standardised Current tobacco smoking, age-standardised.1 Current tobacco smoking, age-standardised.2 Current cigarette smoking, age-standardised Current cigarette smoking, age-standardised.1 Current cigarette smoking, age-standardised.2
0 Country Year Both sexes Male Female Both sexes Male Female Both sexes Male Female Both sexes Male Female
1 Albania 2013 23.8 41.7 6.2 21.3 38.4 4.6 29.7 51.7 8.0 24.5 44.4 5.0
2 Austria 2013 Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available
3 Belarus 2013 22.6 40.7 7.6 21.1 38.4 6.7 27.9 48.2 10.9 25.6 44.3 10.0
4 Belgium 2013 19.7 22.6 16.9 15.5 17.4 13.7 23.9 27.5 20.5 19.8 22.5 17.2

In [49]:
dg.columns


Out[49]:
Index(['Unnamed: 0', 'Unnamed: 1', 'Daily tobacco smoking, age-standardised',
       'Daily tobacco smoking, age-standardised.1',
       'Daily tobacco smoking, age-standardised.2',
       'Daily cigarette smoking, age-standardised',
       'Daily cigarette smoking, age-standardised.1',
       'Daily cigarette smoking, age-standardised.2',
       'Current tobacco smoking, age-standardised',
       'Current tobacco smoking, age-standardised.1',
       'Current tobacco smoking, age-standardised.2',
       'Current cigarette smoking, age-standardised',
       'Current cigarette smoking, age-standardised.1',
       'Current cigarette smoking, age-standardised.2'],
      dtype='object')

In [50]:
dg.T.head()


Out[50]:
0 1 2 3 4 5 6 7 8 9 ... 30 31 32 33 34 35 36 37 38 39
Unnamed: 0 Country Albania Austria Belarus Belgium Bulgaria Croatia Cyprus Czechia Denmark ... San Marino Serbia Slovakia Slovenia Spain Sweden Switzerland The former Yugoslav republic of Macedonia Ukraine United Kingdom of Great Britain and Northern I...
Unnamed: 1 Year 2013 2013 2013 2013 2013 2013 2013 2013 2013 ... 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013
Daily tobacco smoking, age-standardised Both sexes 23.8 Not available 22.6 19.7 30.0 31.1 Not available 24.7 15.6 ... Not available 33.5 22.0 17.7 25.7 11.8 19.5 Not available 25.4 20.3
Daily tobacco smoking, age-standardised.1 Male 41.7 Not available 40.7 22.6 37.5 34.9 Not available 29.4 16.2 ... Not available 36.4 31.8 20.0 28.2 10.6 21.5 Not available 44.2 21.1
Daily tobacco smoking, age-standardised.2 Female 6.2 Not available 7.6 16.9 23.1 27.6 Not available 20.3 14.9 ... Not available 30.8 12.9 15.4 23.2 13.0 17.6 Not available 9.9 19.5

5 rows × 40 columns


In [51]:
dh=dg.T

In [52]:
dh.index[0]


Out[52]:
'Unnamed: 0'

In [53]:
dh.columns=dh.loc[dh.index[0]]

In [54]:
dh=dh.loc[dh.index[1:]]

In [55]:
dh=dh.set_index('Country',append=True).T

In [56]:
dh.head(2)


Out[56]:
Unnamed: 1 Daily tobacco smoking, age-standardised Daily tobacco smoking, age-standardised.1 Daily tobacco smoking, age-standardised.2 Daily cigarette smoking, age-standardised Daily cigarette smoking, age-standardised.1 Daily cigarette smoking, age-standardised.2 Current tobacco smoking, age-standardised Current tobacco smoking, age-standardised.1 Current tobacco smoking, age-standardised.2 Current cigarette smoking, age-standardised Current cigarette smoking, age-standardised.1 Current cigarette smoking, age-standardised.2
Country Year Both sexes Male Female Both sexes Male Female Both sexes Male Female Both sexes Male Female
Unnamed: 0
Albania 2013 23.8 41.7 6.2 21.3 38.4 4.6 29.7 51.7 8.0 24.5 44.4 5.0
Austria 2013 Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available Not available

In [57]:
import numpy as np

In [58]:
dh=pd.DataFrame(dh.set_index(dh.columns[0],append=True).\
    replace('Not available',np.nan).astype(float).stack().stack()).reset_index()

In [59]:
dh.head(2)


Out[59]:
Unnamed: 0 (Unnamed: 1, Year) Country level_3 0
0 Albania 2013 Both sexes Current cigarette smoking, age-standardised 24.5
1 Albania 2013 Both sexes Current tobacco smoking, age-standardised 29.7

In [60]:
dh.columns=['Ország','Év','Nem','Kérdés','Érték']

In [61]:
dh.to_excel('cigi.xlsx')