3 Sun

TIL

[인프런] 단 두 장의 문서로 데이터 분석과 시각화 뽀개기

- Summarize Data

import pandas as pd
import seaborn as sns
import numpy as np
df = sns.load_dataset('iris')
df.shape
(150, 5)
df.head(2)

sepal_length

sepal_width

petal_length

petal_width

species

0

5.1

3.5

1.4

0.2

setosa

1

4.9

3.0

1.4

0.2

setosa

df['w'].value_counts()

해당 키의 원소의 개수를 출력한다. 종류의 개수를 확인할 때 유용하다.

df['species'].value_counts()
setosa        50
virginica     50
versicolor    50
Name: species, dtype: int64
df['petal_width'].value_counts()
0.2    29
1.3    13
1.5    12
1.8    12
1.4     8
2.3     8
1.0     7
0.3     7
0.4     7
2.0     6
2.1     6
0.1     5
1.2     5
1.9     5
1.6     4
2.5     3
2.2     3
2.4     3
1.1     3
1.7     2
0.6     1
0.5     1
Name: petal_width, dtype: int64
pd.DataFrame(df['species'].value_counts())

species

setosa

50

virginica

50

versicolor

50

len(df)

df의 길이를 알 수 있다. shape로도 알 수 있음

len(df)
150
df.shape[0], df.shape[1]
(150, 5)
len(df) == df.shape[0]
True

df['w'].nunique()

고유값의 개수를 보여준다

df['species'].nunique()
3
df['sepal_width'].nunique()
23

df.describe()

수치형 데이터들에 대한 통계값을 보여준다. [option] include : 포함, exclude : 제외 all : 데이터 타입과 관련없이 모든 데이터 np.number : numpy로 숫자 형태의 데이터 np.object : object 타입의 데이터 category : category 타입의 데이터

df.describe()

sepal_length

sepal_width

petal_length

petal_width

count

150.000000

150.000000

150.000000

150.000000

mean

5.843333

3.057333

3.758000

1.199333

std

0.828066

0.435866

1.765298

0.762238

min

4.300000

2.000000

1.000000

0.100000

25%

5.100000

2.800000

1.600000

0.300000

50%

5.800000

3.000000

4.350000

1.300000

75%

6.400000

3.300000

5.100000

1.800000

max

7.900000

4.400000

6.900000

2.500000

df.describe(include='all')

sepal_length

sepal_width

petal_length

petal_width

species

count

150.000000

150.000000

150.000000

150.000000

150

unique

NaN

NaN

NaN

NaN

3

top

NaN

NaN

NaN

NaN

setosa

freq

NaN

NaN

NaN

NaN

50

mean

5.843333

3.057333

3.758000

1.199333

NaN

std

0.828066

0.435866

1.765298

0.762238

NaN

min

4.300000

2.000000

1.000000

0.100000

NaN

25%

5.100000

2.800000

1.600000

0.300000

NaN

50%

5.800000

3.000000

4.350000

1.300000

NaN

75%

6.400000

3.300000

5.100000

1.800000

NaN

max

7.900000

4.400000

6.900000

2.500000

NaN

df.describe(include=[np.object])

species

count

150

unique

3

top

setosa

freq

50

setosa 종이 가장 많이 등장하는 종 중에서 하나인데 50번 등장한다.

some functions()

sum()
Sum values of each object.
count()
Count non-NA/null values of
each object.
median()
Median value of each object.
quantile([0.25,0.75])
Quantiles of each object.
apply(function)
Apply function to each object.
min()
Minimum value in each object.
max()
Maximum value in each object.
mean()
Mean value of each object.
var()
Variance of each object.
std()
Standard deviation of each
object.
# 총합
df['petal_width'].sum()
179.90000000000003
# 갯수
df['petal_width'].count()
150
# 중간값
df['petal_width'].median()
1.3
# 평균값
df['petal_width'].mean()
1.1993333333333336
# 사분위값
df.quantile([0.25, 0.75])

sepal_length

sepal_width

petal_length

petal_width

0.25

5.1

2.8

1.6

0.3

0.75

6.4

3.3

5.1

1.8

# 분산
df.var()
sepal_length    0.685694
sepal_width     0.189979
petal_length    3.116278
petal_width     0.581006
dtype: float64
# 표준편차
df.std()
sepal_length    0.828066
sepal_width     0.435866
petal_length    1.765298
petal_width     0.762238
dtype: float64

판다스로 apply 활용하기 lambda 익명함수 사용하기 - Summarize Data

df.apply()

df.apply(lambda x : x[2])
sepal_length       4.7
sepal_width        3.2
petal_length       1.3
petal_width        0.2
species         setosa
dtype: object
df['species_3'] = df['species'].apply(lambda x : x[:3])
df

sepal_length

sepal_width

petal_length

petal_width

species

species_3

0

5.1

3.5

1.4

0.2

setosa

set

1

4.9

3.0

1.4

0.2

setosa

set

2

4.7

3.2

1.3

0.2

setosa

set

3

4.6

3.1

1.5

0.2

setosa

set

4

5.0

3.6

1.4

0.2

setosa

set

...

...

...

...

...

...

...

145

6.7

3.0

5.2

2.3

virginica

vir

146

6.3

2.5

5.0

1.9

virginica

vir

147

6.5

3.0

5.2

2.0

virginica

vir

148

6.2

3.4

5.4

2.3

virginica

vir

149

5.9

3.0

5.1

1.8

virginica

vir

150 rows × 6 columns

# 뒤에서 3번째 까지의 문자를 가져오는 함수
def smp(x):
    x = x[-3:]
    return x
df['species-3'] = df['species'].apply(smp)
df

sepal_length

sepal_width

petal_length

petal_width

species

species_3

species-3

0

5.1

3.5

1.4

0.2

setosa

set

osa

1

4.9

3.0

1.4

0.2

setosa

set

osa

2

4.7

3.2

1.3

0.2

setosa

set

osa

3

4.6

3.1

1.5

0.2

setosa

set

osa

4

5.0

3.6

1.4

0.2

setosa

set

osa

...

...

...

...

...

...

...

...

145

6.7

3.0

5.2

2.3

virginica

vir

ica

146

6.3

2.5

5.0

1.9

virginica

vir

ica

147

6.5

3.0

5.2

2.0

virginica

vir

ica

148

6.2

3.4

5.4

2.3

virginica

vir

ica

149

5.9

3.0

5.1

1.8

virginica

vir

ica

150 rows × 7 columns

fillna, dropna로 결측치 다루기 - Handling Missing Data

결측치(Not a ...) 에 대해서 처리하는 방법

df.dropna()
Drop rows with any column having NA/null data.
df.fillna(value)
Replace all NA/null data with value.
df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
                   "toy": [np.nan, 'Batmobile', 'Bullwhip'],
                   "born": [pd.NaT, pd.Timestamp("1940-04-25"),pd.NaT]})
df

name

toy

born

0

Alfred

NaN

NaT

1

Batman

Batmobile

1940-04-25

2

Catwoman

Bullwhip

NaT

df.dropna?
# axis = 0 : 행, axis = 1 : 열
# how = 'all' : 모두 널 값일 때, how = 'any' : 하나라도 널 값일 때
df.dropna(axis=1, how='all')

name

toy

born

0

Alfred

NaN

NaT

1

Batman

Batmobile

1940-04-25

2

Catwoman

Bullwhip

NaT

df.dropna(axis=1, how='any')

name

0

Alfred

1

Batman

2

Catwoman

df.dropna(axis=0, how='any')

name

toy

born

1

Batman

Batmobile

1940-04-25

df.fillna?
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5],
                   [np.nan, 3, np.nan, 4]],
                  columns=list('ABCD'))
df

A

B

C

D

0

NaN

2.0

NaN

0

1

3.0

4.0

NaN

1

2

NaN

NaN

NaN

5

3

NaN

3.0

NaN

4

values = {'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3}
df.fillna(value=values)

A

B

C

D

0

0.0

2.0

2.0

0

1

3.0

4.0

2.0

1

2

0.0

1.0

2.0

5

3

0.0

3.0

2.0

4

df.fillna(df['D'].mean())

A

B

C

D

0

2.5

2.0

2.5

0

1

3.0

4.0

2.5

1

2

2.5

2.5

2.5

5

3

2.5

3.0

2.5

4

df.isnull()

A

B

C

D

0

True

False

True

False

1

False

False

True

False

2

True

True

True

False

3

True

False

True

False

df.isnull().sum()
A    3
B    1
C    4
D    0
dtype: int64
df.notnull().sum()
A    1
B    3
C    0
D    4
dtype: int64

assign 으로 새로운 컬럼 만들기, qcut으로 binning, bucketing 하기 - Make New Columns

df = pd.DataFrame({'A': range(1, 11),
                  'B' : np.random.randn(10)})
df

A

B

0

1

0.052204

1

2

-1.489858

2

3

0.427285

3

4

1.148815

4

5

-1.301116

5

6

1.739656

6

7

1.000600

7

8

-1.672363

8

9

0.301468

9

10

-0.221703

df.assign(Area=lambda df: df.Length*df.Height)
Compute and append one or more new columns.
df['Volume'] = df.Length*df.Height*df.Depth
Add single column.
df.assign?
df.assign(ln_A = lambda x: np.log(x.A)).head()

A

B

ln_A

0

1

0.052204

0.000000

1

2

-1.489858

0.693147

2

3

0.427285

1.098612

3

4

1.148815

1.386294

4

5

-1.301116

1.609438

df['ln_A'] = np.log(df.A).head()
df.head()

A

B

ln_A

0

1

0.052204

0.000000

1

2

-1.489858

0.693147

2

3

0.427285

1.098612

3

4

1.148815

1.386294

4

5

-1.301116

1.609438

assign을 통해서 새로운 컬럼을 만들거나, 직접 할당을 해서 만들 수 있다

pd.qcut(df.col, n, labels=False)
Bin column into n buckets.

n개의 버킷 수 만큼 새로운 컬럼을 만들으라는 의미

pd.qcut?
pd.qcut(range(5), 4)
[(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] < (2.0, 3.0] < (3.0, 4.0]]
pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
['good', 'good', 'medium', 'bad', 'bad']
Categories (3, object): ['good' < 'medium' < 'bad']
pd.qcut(df.B, 3, labels=["good", "medium", "bad"])
0    medium
1      good
2    medium
3       bad
4      good
5       bad
6       bad
7      good
8    medium
9      good
Name: B, dtype: category
Categories (3, object): ['good' < 'medium' < 'bad']
pd.qcut(df.B, 2, labels=["good", "bad"])
0    good
1    good
2     bad
3     bad
4    good
5     bad
6     bad
7    good
8     bad
9    good
Name: B, dtype: category
Categories (2, object): ['good' < 'bad']
max(axis=1)
Element-wise max.
clip(lower=-10,upper=10)
Trim values at input thresholds
min(axis=1)
Element-wise min.
abs()
Absolute value.
df.max(axis = 0)
A       10.000000
B        1.739656
ln_A     1.609438
dtype: float64
df.max(axis = 1)
0     1.0
1     2.0
2     3.0
3     4.0
4     5.0
5     6.0
6     7.0
7     8.0
8     9.0
9    10.0
dtype: float64
df.min(axis = 0)
A       1.000000
B      -1.672363
ln_A    0.000000
dtype: float64
df.max(axis = 1)
0     1.0
1     2.0
2     3.0
3     4.0
4     5.0
5     6.0
6     7.0
7     8.0
8     9.0
9    10.0
dtype: float64
df['A'].clip(lower=-10,upper=10)
0     1
1     2
2     3
3     4
4     5
5     6
6     7
7     8
8     9
9    10
Name: A, dtype: int64
df['A'].clip(lower=2,upper=8)
0    2
1    2
2    3
3    4
4    5
5    6
6    7
7    8
8    8
9    8
Name: A, dtype: int64
df['B'].clip(lower=1,upper=1.5)
0    1.000000
1    1.000000
2    1.000000
3    1.148815
4    1.000000
5    1.500000
6    1.000600
7    1.000000
8    1.000000
9    1.000000
Name: B, dtype: float64
df["B"]
0    0.052204
1   -1.489858
2    0.427285
3    1.148815
4   -1.301116
5    1.739656
6    1.000600
7   -1.672363
8    0.301468
9   -0.221703
Name: B, dtype: float64
df["B"].abs()
0    0.052204
1    1.489858
2    0.427285
3    1.148815
4    1.301116
5    1.739656
6    1.000600
7    1.672363
8    0.301468
9    0.221703
Name: B, dtype: float64

Last updated

Was this helpful?