2018년 12월 15일 토요일

PyThon pandas dataframe에서 column / row select

DataFrame의 기본


https://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe
pandas에서는 2차원 배열을 다룰수 있는 데이터 구조를 DataFrame이라고 합니다.
두가지 용어가 있습니다. index (row labels), columns (column labels)


이해를 위해서는 예제가 필요합니다.

예제를 시작하기전에 np, pd 정의 입니다.
In [1]: import numpy as np

In [2]: import pandas as pd
In [34]: d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
   ....:      'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
   ....: 
예제를 위해서 dict구조 d라는 변수에 값을 넣습니다. 이때 pd.Series는 1차원 데이터를 의미하고 index는 row의 lable을 의미합니다.
입력된 데이터를 pd.DataFrame함수를 호출하면 DataFrame 구조로 데이터가 만들어 집니다.(리턴값)

In [35]: df = pd.DataFrame(d)

In [36]: df 
df에 저장된 내용은 아래와 같습니다. 이때 NaN은 값이 없다는 표시 입니다.
Out[36]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0
원하는 row를 선택 하는 방법은 아래와 같습니다.
In [37]: pd.DataFrame(d, index=['d', 'b', 'a'])
Out[37]: 
   one  two
d  NaN  4.0
b  2.0  2.0
a  1.0  1.0
원하는 row와 원하는 columns을 넣어서 dataframe을 만들게 됩니다.
In [38]: pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
Out[38]: 
   two three
d  4.0   NaN
b  2.0   NaN
a  1.0   NaN
지금까지는 DataFrame을 생성하는 방법에 대해서 간단하게 살펴보았습니다.


Selecting column in pandas dataframe


입력 데이터는 아래와 같이 들어있을때 pd.read_csv 함수 호출로 DetaFrame 데이터가 만들어 집니다.

입력 데이터 train.tsv 파일 내용
0 1 지역 3 4
0.30789676210454797 0.3160718715457761 광주 0.618074061962662 부산
0.4779143261004096 0.7640950473377978 인천 0.7554662967547567 인천
0.46356805076582885 0.5837447431729355 대전 0.793675978965779 광주
0.5695109222857196 0.05089301078346342 인천 0.9556152127770076 부산
0.04493729261707624 0.14316706161067427 경기 0.3853064558624778 울산
0.4211392967613088 0.4223696769241083 울산 0.5668579921124862 광주
0.6968309725237914 0.9771633054896907 서울 0.8357267917293922 경기
0.11353740126056755 0.7601654905557846 대전 0.743158407293178 부산
0.22370034270270966 0.3115915771469119 대전 0.11848968372403645 부산
0.137646137601257 0.600286886461799 광주 0.7007352606121582 강원
0.031428666050948184 0.39108944068098905 대전 0.8733145643417124 강원
0.9964849451141898 0.1515641318053479 인천 0.5335673749065628 인천
0.22542471556473298 0.8561772376533481 서울 0.9362096685200896 울산
0.4686621433360696 0.17537990374522128 대구 0.3499523151304561 울산
0.046060811241397714 0.8299155100569963 경기 0.21535901604117658 경기
0.1899909553960777 0.21936448957471155 인천 0.6575452140509177 경기
0.41758513381425333 0.42277109702047366 서울 0.8529515809615816 부산
0.3197992908993763 0.13481439248189842 강원 0.4037015504523124 대구
0.0562629654450455 0.551939153390536 인천 0.9260164254116474 세종
0.587953265713976 0.6413981811587487 대구 0.023584307830762707 대전

DataFrame 구조에서 특정 Colmum을 선택 하는 방법입니다. 다음과 같이 사용합니다. dataframe[[label_index1,label_index2,...]]

Column Select 소스
1
2
3
4
5
6
7
8
9
import pandas as pd

dataset = pd.read_csv("train.tsv", delimiter='\t', header=0)
print("row data")
print(dataset)


print("select data:dataset[['1','3','지역']]")
print(dataset[['1','3','지역']])

결과
row data
           0         1  지역         3   4
0   0.307897  0.316072  광주  0.618074  부산
1   0.477914  0.764095  인천  0.755466  인천
2   0.463568  0.583745  대전  0.793676  광주
3   0.569511  0.050893  인천  0.955615  부산
4   0.044937  0.143167  경기  0.385306  울산
5   0.421139  0.422370  울산  0.566858  광주
6   0.696831  0.977163  서울  0.835727  경기
7   0.113537  0.760165  대전  0.743158  부산
8   0.223700  0.311592  대전  0.118490  부산
9   0.137646  0.600287  광주  0.700735  강원
10  0.031429  0.391089  대전  0.873315  강원
11  0.996485  0.151564  인천  0.533567  인천
12  0.225425  0.856177  서울  0.936210  울산
13  0.468662  0.175380  대구  0.349952  울산
14  0.046061  0.829916  경기  0.215359  경기
15  0.189991  0.219364  인천  0.657545  경기
16  0.417585  0.422771  서울  0.852952  부산
17  0.319799  0.134814  강원  0.403702  대구
18  0.056263  0.551939  인천  0.926016  세종
19  0.587953  0.641398  대구  0.023584  대전
select data:dataset[['1','3','지역']]
           1         3  지역
0   0.316072  0.618074  광주
1   0.764095  0.755466  인천
2   0.583745  0.793676  대전
3   0.050893  0.955615  인천
4   0.143167  0.385306  경기
5   0.422370  0.566858  울산
6   0.977163  0.835727  서울
7   0.760165  0.743158  대전
8   0.311592  0.118490  대전
9   0.600287  0.700735  광주
10  0.391089  0.873315  대전
11  0.151564  0.533567  인천
12  0.856177  0.936210  서울
13  0.175380  0.349952  대구
14  0.829916  0.215359  경기
15  0.219364  0.657545  인천
16  0.422771  0.852952  서울
17  0.134814  0.403702  강원
18  0.551939  0.926016  인천
19  0.641398  0.023584  대구

결론
dataframe[[label_index1,label_index2,...]]


선택된 컬럼들로부터 컬럼 추가 삭제 값 변경 하기


예제를 위해 DataFrame 만듭니다.
In [34]: d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
   ....:      'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
   ....: 

In [35]: df = pd.DataFrame(d)

In [36]: df
Out[36]: 
   one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0
특정 컬럼 선택은 아래와 같이 됩니다. 여기에서는 'one'이라는 컬럼을 선택하였습니다.
In [58]: df['one']
Out[58]: 
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64
값을 입력하면 컬럼 통째로 값이 변경 됩니다.
In [59]: df['three'] = df['one'] * df['two']

In [60]: df['flag'] = df['one'] > 2

In [61]: df
Out[61]: 
   one  two  three   flag
a  1.0  1.0    1.0  False
b  2.0  2.0    4.0  False
c  3.0  3.0    9.0   True
d  NaN  4.0    NaN  False
삭제는 del 을 이용합니다. pop도 삭제하는 곳에 사용 가능합니다.
In [62]: del df['two']

In [63]: three = df.pop('three')

In [64]: df
Out[64]: 
   one   flag
a  1.0  False
b  2.0  False
c  3.0   True
d  NaN  False
추가는 빈컬럼에 원하는 내용을 대입하면 됩니다.
In [65]: df['foo'] = 'bar'

In [66]: df
Out[66]: 
   one   flag  foo
a  1.0  False  bar
b  2.0  False  bar
c  3.0   True  bar
d  NaN  False  bar
NaN이 있는경우 True, 없는경우 False 컬럼 추가하기, isnull 이용
df[컬럼이름]=df['one'].isnull()

>>> df['1']=df['one'].isnull()
>>> df
   one  two  three   flag      1
a  1.0  1.0    1.0  False  False
b  2.0  2.0    4.0  False  False
c  3.0  3.0    9.0   True  False
d  NaN  4.0    NaN  False   True

True인경우 1, False 인경우 컬럼 추가하기, map이용
df[컬럼이름]=df[컬럼이름].map({True:1,False:0})

>>> df['1']=df['1'].map({True:1,False:0})
>>> df
   one  two  three   flag  1
a  1.0  1.0    1.0  False  0
b  2.0  2.0    4.0  False  0
c  3.0  3.0    9.0   True  0
d  NaN  4.0    NaN  False  1

Selecting row in pandas dataframe

row 선택하는 방법에 대해서 알아봅시다. row는 dataframe[시작인덱스:끝인덱스] 로 표현합니다.

소스
import pandas as pd

dataset = pd.read_csv("train.tsv", delimiter='\t', header=0)

selected = dataset[['1','3']]
print(selected[1:4])
print(selected[10:18])

결과
          1         3
1  0.764095  0.755466
2  0.583745  0.793676
3  0.050893  0.955615
           1         3
10  0.391089  0.873315
11  0.151564  0.533567
12  0.856177  0.936210
13  0.175380  0.349952
14  0.829916  0.215359
15  0.219364  0.657545
16  0.422771  0.852952
17  0.134814  0.403702


기타 몇가지 선택방법이 있습니다. 결과값이 Series 로 된 부분은 한 줄로 넘어오는 부분입니다.

The basics of indexing are as follows:
OperationSyntaxResult
Select columndf[col]Series
Select row by labeldf.loc[label]Series
Select row by integer locationdf.iloc[loc]Series
Slice rowsdf[5:10]DataFrame
Select rows by boolean vectordf[bool_vec]DataFrame

예를 살펴보면 row 한줄의 결과를 받을때는 loc, iloc 두개를 사용가능하나 하나는 label 을 사용하고 하나는 숫자를 사용합니다.
In [80]: df.loc['b']
Out[80]: 
one              2
bar              2
flag         False
foo            bar
one_trunc        2
Name: b, dtype: object

In [81]: df.iloc[2]
Out[81]: 
one             3
bar             3
flag         True
foo           bar
one_trunc     NaN
Name: c, dtype: object






댓글 없음:

댓글 쓰기