랜덤한 데이터로 DataFrame 생성 및 원하는 행과 열 데이터 선택하기 [미래 실험실 pYTHON]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 랜덤한 데이터로 DataFrame을 생성하고 원하는 행과 열 데이터를 선택하는 실습입니다.

이번 실습에서는 먼저 100년 동안 일 간 판매 데이터를 랜덤하게 생성할 거예요.

랜덤하게 생성한 판매 데이터로 DataFrame을 생성합니다.

그리고 년도 별 일 별 데이터를 선택하는 실습을 할 거예요.

랜덤한 데이터 만들기
랜덤 데이터로 데이터 프레임 생성
원하는 행 선택하기
  1.  loc 멤버를 사용하여 원하는 행 선택
  2. 인덱스에 시퀀스로  여러 개의 행 선택하기
  3. head 함수로 앞쪽부터 원하는 개수의 행 선택
  4. tail 함수로 뒤쪽부터 원하는 개수의 행 선택
원하는 열 선택하기
열 선택 후 행 선택하여 원하는 쉘 선택하기
전체 코드

랜덤한 데이터 만들기

100년 간 데이터를 만들거예요.

일 별 판매 데이터를 만들거예요.

years = range(1919,2020)
days = range(1,366)
data=[]

랜덤한 값을 만들기 위해 random을 import하세요.

import random

여기에서는 100년 동안 일자 별 랜덤 데이터를 만들거예요.

각 년도 별 판매 차등을 위해 100~199의 랜덤 값을 만들게요.

random.randrange 함수에 범위 n을 입력하면 n개 정수(0~n-1)중에 하나의 값을 랜덤하게 발생합니다.

따라서 random.randrange(100)+100 코드로 00~199의 랜덤 값을 만들 수 있어요.

for y in years:
    ydata=[]
    ry = random.randrange(100)+100

일 별 판매량은 0~799개의 판매 개수에 년도 별 차등하게 만든 랜덤 값 ry를 더하기로 할게요.

현재까지 코드를 포함하여 작성한 코드입니다.

years = range(1919,2020)
days = range(1,366)
data=[]

import random
for y in years:
    ydata=[]
    ry = random.randrange(100)+100
    for r in days:
        ydata.append((random.randrange(800)+ry))
    data.append(ydata)
print(data[0][0:30]) #첫 번째 해의 30일 판매 데이터 출력

다음은 실행 결과는 랜덤하게 나오겠죠.

[778, 164, 761, 610, 926, 620, 263, 202, 198, 859, 839, 392, 635, 672, 250, 525, 485, 285, 180, 919, 779, 787, 880, 376, 920, 896, 142, 462, 441, 685]

랜덤 데이터로 데이터 프레임 생성

랜덤하게 생성한 데이터로 데이터 프레임을 생성합시다.

년도를 행으로 일을 열로 지정합시다.

import pandas as pd
df = pd.DataFrame(data,index=years,columns=days)
print(df)

실행 결과는 다음과 같습니다. (수치는 랜덤합니다.)

      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  279  664  181  538  639  719  708  ...  747  582  255  260  890  564  477
1920  439  354  853  601  675  681  857  ...  366  432  275  837  304  278  804
1921  206  537  635  807  831  350  169  ...  448  935  322  326  727  310  907
1922  251  315  642  500  678  252  383  ...  326  144  805  124  378  891  261
1923  850  618  219  764  939  491  708  ...  314  721  671  601  611  221  956
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...
2015  215  180  213  854  243  189  549  ...  726  219  137  710  291  742  234
2016  684  184  334  631  753  970  311  ...  707  667  453  830  874  328  771
2017  932  531  523  453  616  189  577  ...  704  725  866  934  884  508  540
2018  733  706  884  515  592  451  378  ...  499  546  240  280  700  550  228
2019  348  369  473  669  310  241  785  ...  661  324  311  432  410  251  951

[101 rows x 365 columns]

원하는 행 선택하기

DataFrame에서 행을 선택하는 방법은 여러가지가 있어요.

1. loc 멤버를 사용하여 원하는 행 선택

DataFrame의 멤버 loc에 대괄호와 행 이름을 입력하면 원하는 행을 선택할 수 있어요.

df.loc[행이름]

다음은 2008년 판매 데이터를 선택한 예제 코드입니다.

print(df.loc[2008]) #2008년 판매 데이터 출력
1      155
2      457
3      870
4      339
5      796
      ... 
361    860
362    635
363    580
364    549
365    286
Name: 2008, Length: 365, dtype: int64

loc 멤버를 이용하여 얻어온 년 간 판매 데이터는 Series 형식이죠.

다시 인덱스로 특정 일자 판매 데이터로 얻어올 수 있습니다.

print(df.loc[2008][4]) #2008년 4일째 판매 데이터 출력
print(df.loc[2008][0:5]) #2008년 인덱스 0~4까지 판매 데이터 출력

실행 결과는 다음과 같습니다. (데이터는 랜덤한 수치입니다.)

346
1    622
2    297
3    790
4    346
5    571

2. 인덱스에 시퀀스로 여러 개의 행 선택하기

여러 개의 행을 선택할 때 인덱스에 시퀀스로 선택할 수 있어요.

이 때 시퀀스는 인덱스로 0부터 시작하며 end는 빠지는 것을 잊지 않으셨죠.

df[start:end]

다음은 인덱스 1에서 2까지 출력하는 코드입니다.

1919년부터 100년가 데이터이므로 출력하는 것은 1920년(인덱스 1)부터 1921년(인덱스 2) 데이터를 출력하니다.

print(df[1:3])#시퀀스(1~3, 3은 생략), 인덱스 1(1920년)과 인덱스 2(1921년) 출력

3. head 함수로 앞쪽부터 원하는 개수의 행 선택

head 함수에 선택할 행 개수를 전달하면 앞쪽부터 원하는 개수의 행을 선택할 수 있어요.

인자를 전달하지 않으면 디폴트 값은 5입니다.

음수를 전달하면 해당 개수 뺀 나머지를 앞쪽부터 선택합니다. (이 때 선택은 앞쪽부터 빠지는 것은 뒤쪽부터 빠지는 것입니다.

df.head(n=5)

다음은 head 함수를 호출하여 5년간, 3년간, 3년을 뺀 데이터를 출력하는 예제 코드입니다.

print(df.head()) #앞쪽부터 5년간 데이터 출력
print(df.head(3)) #앞쪽부터 3년간 데이터 출력
print(df.head(-3)) #앞쪽부터 3년을 뺀(97년) 데이터 출력

실행 결과는 다음과 같아요. (수치는 랜덤합니다.)

      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  450  335  857  908  783  302  534  ...  601  854  513  845  872  282  662
1920  877  879  680  763  317  724  553  ...  249  217  848  234  491  656  921
1921  931  991  542  532  476  916  751  ...  409  328  764  384  895  639  825
1922  246  737  830  207  687  599  347  ...  733  268  664  593  719  664  496
1923  791  929  706  797  487  761  259  ...  258  830  529  835  802  479  530

[5 rows x 365 columns]
      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  450  335  857  908  783  302  534  ...  601  854  513  845  872  282  662
1920  877  879  680  763  317  724  553  ...  249  217  848  234  491  656  921
1921  931  991  542  532  476  916  751  ...  409  328  764  384  895  639  825

[3 rows x 365 columns]
      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  450  335  857  908  783  302  534  ...  601  854  513  845  872  282  662
1920  877  879  680  763  317  724  553  ...  249  217  848  234  491  656  921
1921  931  991  542  532  476  916  751  ...  409  328  764  384  895  639  825
1922  246  737  830  207  687  599  347  ...  733  268  664  593  719  664  496
1923  791  929  706  797  487  761  259  ...  258  830  529  835  802  479  530
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...
2012  148  658  144  669  420  195  353  ...  874  435  145  684  832  286  479
2013  768  513  632  645  287  861  983  ...  928  616  599  961  972  469  520
2014  151  545  516  824  886  113  786  ...  413  180  109  687  607  533  528
2015  667  428  812  578  604  220  361  ...  665  605  300  225  353  696  739
2016  150  588  172  556  390  459  240  ...  720  625  601  233  930  387  196

[98 rows x 365 columns]

4. tail 함수로 뒤쪽부터 원하는 개수의 행 선택

tail 함수에 선택할 행 개수를 전달하면 뒤쪽부터 원하는 개수의 행을 선택할 수 있어요.

인자를 전달하지 않으면 디폴트 값은 5입니다.

음수를 전달하면 해당 개수 뺀 나머지를 뒤쪽부터 선택합니다. (이 때 선택은 뒤쪽부터 빠지는 것은 앞쪽부터 빠지는 것입니다.

df.tail(n=5)

다음은 tail 함수를 호출하여 5년간, 3년간, 3년을 뺀 데이터를 출력하는 예제 코드입니다.

print(df.tail()) #뒤쪽부터 5년간 데이터 출력
print(df.tail(3)) #뒤쪽부터 3년간 데이터 출력
print(df.tail(-3))#뒤쪽부터 3년을 뺀(97년) 데이터 출력

실행 결과는 다음과 같습니다. (수치는 랜덤합니다.)

      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
2015  497  276  604  279  416  774  849  ...  861  847  624  331  809  182  210
2016  535  910  861  743  647  912  843  ...  366  312  721  545  986  503  280
2017  706  802  170  524  767  514  272  ...  138  578  642  835  625  837  177
2018  148  309  587  173  735  317  449  ...  457  560  921  572  542  199  207
2019  269  737  498  826  343  246  583  ...  286  367  611  951  213  947  289

[5 rows x 365 columns]
      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
2017  706  802  170  524  767  514  272  ...  138  578  642  835  625  837  177
2018  148  309  587  173  735  317  449  ...  457  560  921  572  542  199  207
2019  269  737  498  826  343  246  583  ...  286  367  611  951  213  947  289

[3 rows x 365 columns]
      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1922  708  201  419  775  594  310  459  ...  877  900  686  340  395  160  261
1923  325  366  764  406  716  351  494  ...  358  316  515  421  938  534  894
1924  792  581  146  534  613  291  144  ...  477  801  143  396  310  617  504
1925  264  722  389  293  551  216  205  ...  440  410  835  695  557  669  580
1926  659  784  507  651  749  478  733  ...  124  121  243  196  710  390  114
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...
2015  497  276  604  279  416  774  849  ...  861  847  624  331  809  182  210
2016  535  910  861  743  647  912  843  ...  366  312  721  545  986  503  280
2017  706  802  170  524  767  514  272  ...  138  578  642  835  625  837  177
2018  148  309  587  173  735  317  449  ...  457  560  921  572  542  199  207
2019  269  737  498  826  343  246  583  ...  286  367  611  951  213  947  289

[98 rows x 365 columns]

원하는 열 선택하기

DataFrame에 인덱스 연산에 열 이름을 입력하는 원하는 열을 선택할 수 있어요.

df[열이름]

다음은 열 선택을 통해 1일차와 363일차의 판매 데이터를 출력하는 예제 코드입니다.

print(df)
print(df[1]) #각 년도의 1일차 판매 데이터 출력
print(df[363]) #각 년도의 363일차 판매 데이터 출력

다음은 실행 결과입니다. (수치는 랜덤합니다.)

      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  377  894  575  897  893  769  664  ...  232  480  898  240  219  884  580
1920  306  251  797  850  176  624  385  ...  826  835  333  788  505  862  838
1921  328  953  295  330  347  349  908  ...  550  399  864  798  333  751  828
1922  838  423  652  388  436  612  609  ...  362  729  763  240  284  173  177
1923  202  336  378  521  874  674  513  ...  290  384  374  387  639  339  464
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...
2015  458  895  310  390  704  625  656  ...  313  895  588  375  667  593  778
2016  709  813  662  608  904  156  142  ...  635  163  597  903  254  243  352
2017  530  200  498  639  356  356  599  ...  205  771  931  730  281  218  446
2018  315  570  668  914  402  217  444  ...  239  806  433  221  620  659  881
2019  913  583  316  824  308  818  892  ...  594  925  440  179  296  208  497

[101 rows x 365 columns]
1919    377
1920    306
1921    328
1922    838
1923    202
       ... 
2015    458
2016    709
2017    530
2018    315
2019    913

Name: 1, Length: 101, dtype: int64
1919    219
1920    505
1921    333
1922    284
1923    639
       ... 
2015    667
2016    254
2017    281
2018    620
2019    296
Name: 363, Length: 101, dtype: int64

Process finished with exit code 0

열 선택 후 행 선택하여 원하는 쉘 선택하기

여기에서의 결과도 Series 형식이죠.

다시 인덱스 연산으로 년도나 시퀀스를 전달하면 원하는 쉘(일, 년도)을 선택할 수 있어요.

다음은 2일차를 선택한 후에 2018년(결국 2018년 2일차)와 시퀀스 [0:5]를 선택하여 출력하는 예제 코드입니다.

print(df)
print(df[2][2018])
print(df[2][0:5])

실행 결과는 다음과 같습니다.

      1    2    3    4    5    6    7    ...  359  360  361  362  363  364  365
1919  387  329  458  669  715  870  205  ...  392  238  514  186  544  765  200
1920  639  871  336  424  559  717  206  ...  948  294  759  692  410  773  369
1921  328  466  288  292  344  553  923  ...  656  701  459  969  384  713  460
1922  471  421  924  916  168  474  880  ...  426  798  475  376  564  546  244
1923  598  527  275  272  201  324  624  ...  475  926  831  616  266  781  902
...   ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...
2015  715  692  569  262  120  415  188  ...  355  623  138  859  535  430  170
2016  154  212  728  386  605  342  467  ...  137  778  410  314  304  384  539
2017  635  622  599  687  480  939  242  ...  185  602  727  241  755  538  676
2018  476  554  536  565  562  148  227  ...  661  744  516  538  419  633  764
2019  442  662  630  898  139  566  319  ...  827  133  472  141  513  227  345

[101 rows x 365 columns]
554
1919    329
1920    871
1921    466
1922    421
1923    527
Name: 2, dtype: int64

전체 코드

#랜덤으로 100년간 일 별 판매 개수 생성
#데이터 프레임 생성(행:year, 열:day)
#년도별 데이터 확인하기 : 원하는 행
#일 별 데이터 확인하기  : 원하는 열
#년도와 일 별 데이터 확인하기 :원하는 행, 열

years = range(1919,2020)
days = range(1,366)
data=[]

import random
for y in years:
    ydata=[]
    ry = random.randrange(100)+100
    for r in days:
        ydata.append((random.randrange(800)+ry))
    data.append(ydata)
#print(data[0][0:30]) #첫 번째 해의 30일 판매 데이터 출력

import pandas as pd
df = pd.DataFrame(data,index=years,columns=days)
#print(df.loc[2008]) #2008년 판매 데이터 출력
#print(df.loc[2008][4]) #2008년 4일째 판매 데이터 출력
#print(df.loc[2008][0:5]) #2008년 인덱스 0~4까지 판매 데이터 출력
#print(df[1:3])#시퀀스(1~3, 3은 생략), 인덱스 1(1920년)과 인덱스 2(1921년) 출력
#print(df.head()) #앞쪽부터 5년간 데이터 출력
#print(df.head(3)) #앞쪽부터 3년간 데이터 출력
#print(df.head(-3)) #앞쪽부터 3년을 뺀(97년) 데이터 출력
#print(df.tail()) #뒤쪽부터 5년간 데이터 출력
#print(df.tail(3)) #뒤쪽부터 3년간 데이터 출력
#print(df.tail(-3))#뒤쪽부터 3년을 뺀(97년) 데이터 출력
#print(df)
#print(df[1]) #각 년도의 1일차 판매 데이터 출력
#print(df[363]) #각 년도의 363일차 판매 데이터 출력
print(df[2][2018])
print(df[2][0:5])