pandas I

Pandas I


Pandas

  • 구조화된 데이터의 처리를 지원하는 Python 라이브러리
  • panel data → pandas
  • 고성능 array 계산 라이브러리인 numpy와 통합하여, 강력한“스프레드시트” 처리 기능을 제공
  • 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
  • 데이터 처리 및 통계 분석을 위해 사용


데이터 로드

In [1]:
import pandas as pd
In [2]:
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data' #Data URL
df_data = pd.read_csv(
    data_url, sep="\s+", header=None
)  # csv 타입 데이터 로드, separate는 빈공간으로 지정하고, Column은 없음
  • 데이터 로드할때 url을 통해서 로드 가능하다.
  • 일반적으로는 .csv파일 위치를 로드하게 된다.
In [3]:
df_data.head()
Out[3]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222.0 18.7 396.90 5.33 36.2

head()함수는 DataFrame에서 앞에 5개를 보여준다.(default=5) 인자로 숫자를 넣어주면 해당 인자값 만큼 데이터를 보여준다.

In [4]:
df_data.columns = [
    "CRIM",
    "ZN",
    "INDUS",
    "CHAS",
    "NOX",
    "RM",
    "AGE",
    "DIS",
    "RAD",
    "TAX",
    "PTRATIO",
    "B",
    "LSTAT",
    "MEDV",
]
# Column Header 이름 지정
df_data.head()
Out[4]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT MEDV
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222.0 18.7 396.90 5.33 36.2

DataFrame의 컬럼명을 설명하고 싶으면 위 처럼 .columns속성에 값을 지정해 주면 된다.



Series

  • column vector를 표현하는 object
In [5]:
from pandas import Series, DataFrame
import pandas as pd
import numpy as np

image.png

  • shift+tab을 누르면 위와 같은 Docstring을 볼 수 있다.
In [6]:
list_data = [1, 2, 3, 4, 5]
example_obj = Series(data=list_data)
example_obj
Out[6]:
0    1
1    2
2    3
3    4
4    5
dtype: int64

image.png

image.png

In [7]:
list_data = [1, 2, 3, 4, 5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = Series(data=list_data, index=list_name)
example_obj
Out[7]:
a    1
b    2
c    3
d    4
e    5
dtype: int64
In [8]:
example_obj.index
Out[8]:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
In [9]:
example_obj.values
Out[9]:
array([1, 2, 3, 4, 5], dtype=int64)
In [10]:
type(example_obj.values)
Out[10]:
numpy.ndarray
  • index인자를 통해서 index 이름을 지정할 수 있다.
  • .index속성을 통해서 index값을 반환 받는다.
  • .values속성을 통해서 data값을 반환 받는다.
In [11]:
dict_data = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} # data와 index 이름을 지정
example_obj = Series(dict_data, dtype=np.float32, name="example_data")
example_obj
Out[11]:
a    1.0
b    2.0
c    3.0
d    4.0
e    5.0
Name: example_data, dtype: float32
  • dtype인자를 통해서 Data type설정
  • name인자를 통해서 Series의 이름 설정


data 접근하기

In [12]:
example_obj['a']
Out[12]:
1.0


data에 값 할당하기

In [13]:
example_obj["a"] = 3.2
example_obj
Out[13]:
a    3.2
b    2.0
c    3.0
d    4.0
e    5.0
Name: example_data, dtype: float32


astype

In [14]:
example_obj = example_obj.astype(int)
example_obj
Out[14]:
a    3
b    2
c    3
d    4
e    5
Name: example_data, dtype: int32
  • astype()메서드를 통해서 타입 변환이 가능하다.


Data에 대한 정보를 저장

In [15]:
example_obj.name = "number"
example_obj.index.name = "alphabet"
example_obj
Out[15]:
alphabet
a    3
b    2
c    3
d    4
e    5
Name: number, dtype: int32
  • 많이 쓰이진 않는다...
In [16]:
dict_data_1 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
indexes = ["a", "b", "c", "d", "e", "f", "g", "h"]
series_obj_1 = Series(dict_data_1, index=indexes)
series_obj_1
Out[16]:
a    1.0
b    2.0
c    3.0
d    4.0
e    5.0
f    NaN
g    NaN
h    NaN
dtype: float64

데이터에는 'a' ~'e'까지의 인덱스가 있지만 index인자로 넣어진 값은 'a' ~ 'h'까지인 list가 index인자로 들어가게 되면 index값을 기준으로 Series생성한다. 이때 없는 값은 NaN값이 들어오는 것을 확인 할 수 있다.



DataFrame

image.png


DataFrame memory

image.png


DataFrame 생성

In [17]:
raw_data = {
    "first_name": ["Jason", "Molly", "Tina", "Jake", "Amy"],
    "last_name": ["Miller", "Jacobson", "Ali", "Milner", "Cooze"],
    "age": [42, 52, 36, 24, 73],
    "city": ["San Francisco", "Baltimore", "Miami", "Douglas", "Boston"],
}
df = pd.DataFrame(raw_data, columns=["first_name", "last_name", "age", "city"])
df
Out[17]:
first_name last_name age city
0 Jason Miller 42 San Francisco
1 Molly Jacobson 52 Baltimore
2 Tina Ali 36 Miami
3 Jake Milner 24 Douglas
4 Amy Cooze 73 Boston
  • dict타입으로 넣게 되면 {column_name:data}형태로 넣어진다.
In [18]:
DataFrame(raw_data, columns=["age", "city"])
Out[18]:
age city
0 42 San Francisco
1 52 Baltimore
2 36 Miami
3 24 Douglas
4 73 Boston
  • columns인자를 통해서 해당 컬럼만 만들 수 있다.
In [19]:
DataFrame(raw_data, columns=["first_name", "last_name", "age", "city", "debt"])
Out[19]:
first_name last_name age city debt
0 Jason Miller 42 San Francisco NaN
1 Molly Jacobson 52 Baltimore NaN
2 Tina Ali 36 Miami NaN
3 Jake Milner 24 Douglas NaN
4 Amy Cooze 73 Boston NaN
  • Series와 마찬가지로 없는 column명을 추가하게 되면 NaN값으로 값이 들어간다.


column 선택

In [20]:
df = pd.DataFrame(raw_data, columns=["first_name", "last_name", "age", "city"])
df.first_name
Out[20]:
0    Jason
1    Molly
2     Tina
3     Jake
4      Amy
Name: first_name, dtype: object
  • .(column명)을 통해서 한 컬럼을 가지고 온다.
In [21]:
df['first_name']
Out[21]:
0    Jason
1    Molly
2     Tina
3     Jake
4      Amy
Name: first_name, dtype: object
  • [컬럼명]을 통해서도 접근 가능


DataFrame indexing

  • loc: index location
  • iloc: index position
  • loc은 index이름, iloc은 index number을 통해서 indexing인 된다.
  • loc, iloc는 동일하게 [행에 대한 조건,열에 대한 조건]로 indexing한다.
In [22]:
s = pd.Series(np.nan, index=[49, 48, 47, 46, 45, 1, 2, 3, 4, 5])
s.loc[:3]
Out[22]:
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
dtype: float64
  • 처음부터 index의 이름이 3인 값까지 slicing이 된다.
In [23]:
s.iloc[:3]
Out[23]:
49   NaN
48   NaN
47   NaN
dtype: float64
  • 처음부터 3번째 위치까지 slicing이 된다.
In [24]:
df.loc[:,['first_name','last_name']]
Out[24]:
first_name last_name
0 Jason Miller
1 Molly Jacobson
2 Tina Ali
3 Jake Milner
4 Amy Cooze
In [25]:
df["age"].iloc[1:]
Out[25]:
1    52
2    36
3    24
4    73
Name: age, dtype: int64


DataFrame handling

In [26]:
df['age'] > 40
Out[26]:
0     True
1     True
2    False
3    False
4     True
Name: age, dtype: bool
In [27]:
df['debt']=df['age'] > 40
df
Out[27]:
first_name last_name age city debt
0 Jason Miller 42 San Francisco True
1 Molly Jacobson 52 Baltimore True
2 Tina Ali 36 Miami False
3 Jake Milner 24 Douglas False
4 Amy Cooze 73 Boston True
  • 이렇게 할당도 가능 하다.
In [28]:
values = Series(data=["M", "F", "F"], index=[0, 1, 3])
values
Out[28]:
0    M
1    F
3    F
dtype: object
In [29]:
df
Out[29]:
first_name last_name age city debt
0 Jason Miller 42 San Francisco True
1 Molly Jacobson 52 Baltimore True
2 Tina Ali 36 Miami False
3 Jake Milner 24 Douglas False
4 Amy Cooze 73 Boston True
In [30]:
df["sex"] = values
df
Out[30]:
first_name last_name age city debt sex
0 Jason Miller 42 San Francisco True M
1 Molly Jacobson 52 Baltimore True F
2 Tina Ali 36 Miami False NaN
3 Jake Milner 24 Douglas False F
4 Amy Cooze 73 Boston True NaN

여기서 'sex'라는 새로운 컬럼에 values라는 Series를 넣게 되는데 이때 Series에 없는 index에 대해서는 자동적으로 DataFrame에서 NaN값으로 처리하게 된다.

transpose

In [31]:
df.T
Out[31]:
0 1 2 3 4
first_name Jason Molly Tina Jake Amy
last_name Miller Jacobson Ali Milner Cooze
age 42 52 36 24 73
city San Francisco Baltimore Miami Douglas Boston
debt True True False False True
sex M F NaN F NaN

값 출력

In [32]:
df.values
Out[32]:
array([['Jason', 'Miller', 42, 'San Francisco', True, 'M'],
       ['Molly', 'Jacobson', 52, 'Baltimore', True, 'F'],
       ['Tina', 'Ali', 36, 'Miami', False, nan],
       ['Jake', 'Milner', 24, 'Douglas', False, 'F'],
       ['Amy', 'Cooze', 73, 'Boston', True, nan]], dtype=object)

csv로 변환

In [33]:
df.to_csv()
Out[33]:
',first_name,last_name,age,city,debt,sex\r\n0,Jason,Miller,42,San Francisco,True,M\r\n1,Molly,Jacobson,52,Baltimore,True,F\r\n2,Tina,Ali,36,Miami,False,\r\n3,Jake,Milner,24,Douglas,False,F\r\n4,Amy,Cooze,73,Boston,True,\r\n'

column 삭제

In [34]:
display(df.drop("debt", axis=1))
display(df)
first_name last_name age city sex
0 Jason Miller 42 San Francisco M
1 Molly Jacobson 52 Baltimore F
2 Tina Ali 36 Miami NaN
3 Jake Milner 24 Douglas F
4 Amy Cooze 73 Boston NaN
first_name last_name age city debt sex
0 Jason Miller 42 San Francisco True M
1 Molly Jacobson 52 Baltimore True F
2 Tina Ali 36 Miami False NaN
3 Jake Milner 24 Douglas False F
4 Amy Cooze 73 Boston True NaN
  • .drop은 결과 값을 반환하기 때문에 df에는 영향이 없다.
In [35]:
del df['debt']
df
Out[35]:
first_name last_name age city sex
0 Jason Miller 42 San Francisco M
1 Molly Jacobson 52 Baltimore F
2 Tina Ali 36 Miami NaN
3 Jake Milner 24 Douglas F
4 Amy Cooze 73 Boston NaN
  • del명령어는 해당 값을 메모리에서 삭제한다.
In [36]:
pop = {"Nevada": {2001: 2.4, 2002: 2.9}, "Ohio": {2000: 1.5, 2001: 1.7, 2002: 3.6}}
DataFrame(pop)
Out[36]:
Nevada Ohio
2001 2.4 1.7
2002 2.9 3.6
2000 NaN 1.5

'AI > 이론' 카테고리의 다른 글

Pandas IV  (0) 2021.01.28
Pandas III  (0) 2021.01.28
딥러닝 학습방법 이해하기  (0) 2021.01.27
Pandas II  (0) 2021.01.27
경사하강법 II  (0) 2021.01.26
경사하강법 I  (0) 2021.01.26
행렬  (0) 2021.01.25
벡터  (0) 2021.01.25

+ Recent posts