[pandas] 데이터 다루기

kkiyou·2021년 6월 28일
0

Data Science

목록 보기
10/11
post-custom-banner

1. 데이터 확인하기

1.1. info

DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, show_counts=None, null_counts=None)

DataFrame의 type, RangeIndex, column name, values Dtype, non-null Count등의 정보를 반환한다.

pandas.DataFrame.info



1.2. head

DataFrame.head(n=5)

DataFrame에서 첫 번째부터 n번째 까지의 데이터를 반환한다. Default n은 5이다.

pandas.DataFrame.head



1.3. tail

DataFrame.tail(n=5)

DataFrame에서 n부터 n-4번째 까지의 데이터를 반환한다. Default n은 5이다.

pandas.DataFrame.tail



1.4. sample

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

DataFrame에서 무작위로 n개의 index를 반환한다.

pandas.DataFrame.sample



1.5. indexing

DataFrame[column_name]

column_name에 해당하는 index을 가져온다.


DataFrame.column_name

한편, 위와 같이 attribute에 접근하는 것 처럼 .(dot)을 활용해 column_name에 접근할 수 있다.



1.6. slicing

DataFrame[start_index_n, end_index_n]
DataFrame[start_index_name, end_index_name]

start_index_n α<\leq \alpha < end_index_n 에 해당하는 index을 가져온다.


DataFrame[column_name][start_index_n, end_index_n]
DataFrame[column_name][start_index_name, end_index_name]

column_name에 해당하는 에서start_index_name α<\leq \alpha < end_index_name 에 해당하는 index를 가져온다. 만약 index에 중복된 값이 있다면 KeyError: "Cannot get left slice bound for non-unique label Error가 발생한다.



1.7. values

property DataFrame.values: numpy.ndarray

DataFrame의 value를 반환한다.

pandas.DataFrame.values



1.8. Index

DataFrame.index: Index

DataFrame의 index를 반환한다. pandas.index와 다르단 것에 주의하자.

pandas.DataFrame.index



1.9. columns

DataFrame.columns: Index

DataFrame의 columns를 반환한다.

pandas.DataFrame.columns



1.10. loc

property DataFrame.loc: pandas.core.indexing._LocIndexer

index와 column의 label(명칭)을 통해 값을 가져온다.

# index_label에 위치한 값을 Series로 반환한다.
>>> df.loc[<index_label>]
>>> type(df.loc[<index_label>])
pandas.core.series.Series

# index_label과 column_label에 위치한 값을 반환한다.
>>> df.loc[<index_label>, <column_label>]

pandas.DataFrame.loc



1.11. iloc

property DataFrame.iloc: pandas.core.indexing._iLocIndexer

index의 위치를 통해 값을 가져온다.(integer-location based indexing)

# index_n에 위치한 값을 Series로 반환한다.
>>> df.iloc[<index_n>]
>>> type(df.iloc[<index_n>])
pandas.core.series.Series

# index_n에 위치한 값을 DataFrame으로 반환한다.
>>> df.iloc[[<index_n>]]
>>> type(df.iloc[[<index_n>]])
pandas.core.frame.DataFrame

# Slicing을 통해, 해당 범위의 값을 DataFrame으로 반환한다.
>>> df.iloc[<start_n>:<end_n>]

# Fancy indexing을 통해, 해당 index의 값을 DataFrame으로 반환한다.
>>> df.iloc[[index_1, index_2, index_3...]]

# lambda 표현식을 통해, 참인 값을 반환한다.
# 짝수 index를 반환한다.
>>> df.iloc[lambda x: x.index % 2 == 0]

pandas.DataFrame.iloc



1.12. at

property DataFrame.at: pandas.core.indexing._AtIndexer

# index_label과 column_label에 위치한 값을 반환한다.
>>> df.at[<index_label>, <column_label>]

index와 column의 label(명칭)을 통해 하나의 값을 가져온다.

pandas.DataFrame.at



1.13. iat

property DataFrame.iat: pandas.core.indexing._iAtIndexer

위치(integer position)을 통해 하나의 값을 가져온다.

# index_n과 column_n에 위치한 값을 반환한다.
>>> df.at[<index_n>, <column_n>]

pandas.DataFrame.iat



1.14. boolean indexing

DataFrame에 비교연산자를 사용하면 True or False값을 반환한다.

>>> pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv")

# URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)>가 발생하면, 아래의 구문을 실행한다.

# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context

>>> data["tip"] > 5
0      False
1      False
2      False
3      False
4      False
       ...  
239     True
240    False
241    False
242    False
243    False
Name: tip, Length: 244, dtype: bool

>>> data[data["tip"] > 5][["total_bill", "tip"]]
    total_bill	tip
23	39.42	7.58
44	30.40	5.60
47	32.40	6.00
52	34.81	5.20
59	48.27	6.73
85	34.83	5.17
88	24.71	5.85
116	29.93	5.07
141	34.30	6.70
155	29.85	5.14
170	50.81	10.00
172	7.25	5.15
181	23.33	5.65
183	23.17	6.50
211	25.89	5.16
212	48.33	9.00
214	28.17	6.50
239	29.03	5.92

# 위의 결괏값과 같다.
>>> data.loc[data["tip"] > 5, ["total_bill", "tip"]]
>>> data[data["tip"] > 5].loc[:, "total_bill":"tip"]


1.15. size

property DataFrame.size: int

DataFrame의 총 values의 개수를 반환한다.

pandas.DataFrame.size



1.16. unique

Series.unique()

Series에서 중복을 제거한 유일한 값을 가져온다. 즉 Series에 포함된 값을 반환한다. 따라서 수정하거나 가져온 데이터의 고유 값을 확인하는데 사용한다.


한편, unique는 DataFrame에는 사용할 수 없음에 주의하자.

pandas.Series.unique



1.17. value_counts

DataFrame.value_counts(subset=None, normalize=False, sort=True, ascending=False)

unique한 값과 그 개수를 반환한다. 그런데 DataFrame에서 사용하게 되면 여러 columns로 구성된 index를 하나로 보고 unique한 값을 찾기 때문에 사실상 의미가 없다. 따라서 Series에서만 사용하는 것이 바람직하다.

pandas.DataFrame.value_counts




2. 수정하기

2.1. rename

DataFrame.rename(mapper=None, 
                 index=None, 
                 columns=None, 
                 axis=None, 
                 copy=True, 
                 inplace=False, 
                 level=None, 
                 errors='ignore')

rename은 아래와 같이 세가지 형태로 사용한다.
(index=index_mapper, columns=columns_mapper, ...)
(mapper, axis={'index', 'columns'}, ...)
(mapper, axis={'0', '1'}, ...)

>>> data.rename(index={1: 999}, columns={"size": "size_"}).loc[999]
total_bill     10.34
tip             1.66
sex             Male
smoker            No
day              Sun
time          Dinner
size_              3
Name: 999, dtype: object

>>> data.rename(mapper={"sex": "gender"}, axis="columns").loc[0]
total_bill     16.99
tip             1.01
gender        Female
smoker            No
day              Sun
time          Dinner
size               2
Name: 0, dtype: object

# 위와 결괏값이 같다.
>>> data.rename(mapper={"sex": "gender"}, axis=1).loc[0]

pandas.DataFrame.rename




3. Missing Value(결측값)

3.1. 결측값 확인

3.1.1. isna, isnull

3.1.2. nonull


3.2. 결측값 처리

3.2.1. interpolate

DataFrame.interpolate(method='linear', 
                      axis=0, 
                      limit=None, 
                      inplace=False, 
                      limit_direction=None, 
                      limit_area=None, 
                      downcast=None, 
                      **kwargs
                     )

결측값을 선형 기반으로 채운다.

  • method에는 여러 방법이 존재하나, MultiIndex에서는 linear만 지원함

3.2.2. fillna

DataFrame.fillna(value=None, 
                 method=None, 
                 axis=None, 
                 inplace=False, 
                 limit=None, 
                 downcast=None
                )

결측값을 value값으로 채운다.




4. 통계분석하기

4.1. describe

DataFrame.describe(percentiles=None, include=None, exclude=None, datetime_is_numeric=False)

count, mean, std, min, 25%, 50%, 75%, max에 해당하는 통계 분석값을 반환한다. 단, 숫자 자료형으로 이루어진 colums만 분석할 수 있다.

pandas.DataFrame.describe

count
mean
max
min
std

########
추가
##########3
DataFrame.values: ndarray 형태로 반환함
DataFrame.values.tolist(): 리스트 형태로 반환함
DataFrame.values.to_dict(): dictionary 형태로 반환함


4.2. crosstab

pandas.crosstab(index, # index columns에 올 data
                columns, # Feature columns에 올 data
                values=None, # aggfunc와 함께 사용하여 value(표의 값)을 aggfunc을 적용하는 것. groupby와 유사함.
                aggfunc=None, # sum, count, mean
                rownames=None, # index columns 명
                colnames=None, # feature columns 명
                margins=False, # 각 행렬의 총합
                margins_name='All', 
                dropna=True, # 결측치를 drop함
                normalize=False # 전체 값에서 차지하는 비율을 표시함
               )
  • normarlize
    • If passed ‘all’ or True, will normalize over all values.
    • If passed ‘index’ will normalize over each row.
    • If passed ‘columns’ will normalize over each column.
    • If margins is True, will also normalize margin values.
import pandas as pd

a = np.array(["foo", "foo", "foo", "foo", "bar", "bar",
              "bar", "bar", "foo", "foo", "foo"], dtype=object)
b = np.array(["one", "one", "one", "two", "one", "one",
              "one", "two", "two", "two", "one"], dtype=object)
c = np.array(["dull", "dull", "shiny", "dull", "dull", "shiny",
              "shiny", "dull", "shiny", "shiny", "shiny"],
             dtype=object)
             
print(pd.crosstab(index=a,
                  columns=[b, c],
                 )
     )
# col_0  one        two      
# col_1 dull shiny dull shiny
# row_0                      
# bar      1     2    1     0
# foo      2     2    1     2

print(pd.crosstab(index=a,
                  columns=[b, c],
                  rownames=['a'],
                  colnames=['b', 'c']
                 )
     )
# b    one        two      
# c   dull shiny dull shiny
# a                        
# bar    1     2    1     0
# foo    2     2    1     2

print(pd.crosstab(index=a,
                  columns=[b, c],
                  rownames=['a'],
                  colnames=['b', 'c'],
                  margins=True
                 )
     )
# b    one        two       All
# c   dull shiny dull shiny    
# a                            
# bar    1     2    1     0   4
# foo    2     2    1     2   7
# All    3     4    2     2  11

print(pd.crosstab(index=a,
                  columns=[b, c],
                  rownames=['a'],
                  colnames=['b', 'c'],
                  margins=True,
                  normalize="all"
                 )
     )
# b         one                 two                 All
# c        dull     shiny      dull     shiny          
# a                                                    
# bar  0.090909  0.181818  0.090909  0.000000  0.363636
# foo  0.181818  0.181818  0.090909  0.181818  0.636364
# All  0.272727  0.363636  0.181818  0.181818  1.000000
post-custom-banner

0개의 댓글