작성자: admin 작성일시: 2016-04-15 21:13:37 조회수: 1353 다운로드: 51
카테고리: Python 태그목록:

Pandas 패키지의 소개

Pandas 패키지

  • Index를 가진 자료형인 R의 data.frame 자료형을 Python에서 구현

Pandas 자료형

  • Series
    • 시계열 데이터
    • Index를 가지는 1차원 NumPy Array
  • DataFrame
    • 복수 필드 시계열 데이터 또는 테이블 데이터
    • Index를 가지는 2차원 NumPy Array
  • Index
    • Label: 각각의 Row/Column에 대한 이름
    • Name: 인덱스 자체에 대한 이름

Series

명시적인 Index를 가지지 않는 Series

In [1]:
s = pd.Series([4, 7, -5, 3])
s
Out[1]:
0    4
1    7
2   -5
3    3
dtype: int64
In [2]:
s.values
Out[2]:
array([ 4,  7, -5,  3])
In [3]:
type(s.values)
Out[3]:
numpy.ndarray
In [4]:
s.index
Out[4]:
RangeIndex(start=0, stop=4, step=1)
In [5]:
type(s.index)
Out[5]:
pandas.indexes.range.RangeIndex

Vectorized Operation

In [6]:
s * 2
Out[6]:
0     8
1    14
2   -10
3     6
dtype: int64
In [7]:
np.exp(s)
Out[7]:
0      54.598150
1    1096.633158
2       0.006738
3      20.085537
dtype: float64

명시적인 Index를 가지는 Series

  • 생성시 index 인수로 Index 지정
  • Index 원소는 각 데이터에 대한 key 역할을 하는 Label
  • dict
In [8]:
s2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"])
s2
Out[8]:
d    4
b    7
a   -5
c    3
dtype: int64
In [9]:
s2.index
Out[9]:
Index([u'd', u'b', u'a', u'c'], dtype='object')

Series Indexing 1: Label Indexing

  • Single Label
  • Label Slicing
    • 마지막 원소 포함
  • Label을 원소로 가지는 Label (Label을 사용한 List Fancy Indexing)
    • 주어진 순서대로 재배열
In [10]:
s2['a']
Out[10]:
-5
In [11]:
s2["b":"c"]
Out[11]:
b    7
a   -5
c    3
dtype: int64
In [12]:
s2[['a', 'b']]
Out[12]:
a   -5
b    7
dtype: int64

Series Indexing 2: Integer Indexing

  • Single Integer
  • Integer Slicing
    • 마지막 원소를 포함하지 않는 일반적인 Slicing
  • Integer List Indexing (List Fancy Indexing)
  • Boolearn Fancy Indexing
In [13]:
s2[2]
Out[13]:
-5
In [14]:
s2[1:4]
Out[14]:
b    7
a   -5
c    3
dtype: int64
In [15]:
s2[[2, 1]]
Out[15]:
a   -5
b    7
dtype: int64
In [16]:
s2[s2 > 0]
Out[16]:
d    4
b    7
c    3
dtype: int64

dict 연산

In [17]:
"a" in s2, "e" in s2
Out[17]:
(True, False)
In [18]:
for k, v in s2.iteritems():
    print(k, v)
d 4
b 7
a -5
c 3
In [19]:
s2["d":"a"]
Out[19]:
d    4
b    7
a   -5
dtype: int64

dict 데이터를 이용한 Series 생성

In [20]:
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
s3
Out[20]:
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64
In [21]:
states = ['California', 'Ohio', 'Oregon', 'Texas']
s4 = pd.Series(sdata, index=states)
s4
Out[21]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64
In [22]:
pd.isnull(s4)
Out[22]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool
In [23]:
pd.notnull(s4)
Out[23]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool
In [24]:
s4.isnull()
Out[24]:
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool
In [25]:
s4.notnull()
Out[25]:
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

Index 기준 연산

In [26]:
print(s3.values, s4.values)
s3.values + s4.values
[35000 16000 71000  5000] [    nan  35000.  16000.  71000.]
Out[26]:
array([    nan,  51000.,  87000.,  76000.])
In [27]:
s3 + s4
Out[27]:
California         NaN
Ohio           70000.0
Oregon         32000.0
Texas         142000.0
Utah               NaN
dtype: float64

Index 이름

In [28]:
s4
Out[28]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64
In [29]:
s4.name = "population"
s4
Out[29]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64
In [30]:
s4.index.name = "state"
s4
Out[30]:
state
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

Index 변경

In [31]:
s
Out[31]:
0    4
1    7
2   -5
3    3
dtype: int64
In [32]:
s.index
Out[32]:
RangeIndex(start=0, stop=4, step=1)
In [33]:
s.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
s
Out[33]:
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64
In [34]:
s.index
Out[34]:
Index([u'Bob', u'Steve', u'Jeff', u'Ryan'], dtype='object')

연습 문제 1

다음과 같은 Series 를 만들어 보세요.

  1. 명시적 index 가 없는 Series
  2. 명시적 index 가 있는 Series

DataFrame

  • Multi-Series
    • 동일한 Row 인덱스를 사용하는 복수 Series
    • Series를 value로 가지는 dict
  • 2차원 행렬
    • DataFrame을 행렬로 생각하면 각 Series는 행렬의 Column의 역할
    • (Row) Index와 Column Index를 가진다.
  • NumPy Array와 차이점
    • 각 Column(Series)마다 type이 달라도 된다.
In [35]:
data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
df
Out[35]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
In [36]:
pd.DataFrame(data, columns=['year', 'state', 'pop'])
Out[36]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
In [37]:
df.dtypes
Out[37]:
pop      float64
state     object
year       int64
dtype: object

명시적인 Column/Row Index를 가지는 DataFrame

In [38]:
df2 = pd.DataFrame(data, 
                   columns=['year', 'state', 'pop', 'debt'],
                   index=['one', 'two', 'three', 'four', 'five'])
df2
Out[38]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN

Single Column Access

In [39]:
df["state"]
Out[39]:
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
Name: state, dtype: object
In [40]:
type(df["state"])
Out[40]:
pandas.core.series.Series
In [41]:
df.state
Out[41]:
0      Ohio
1      Ohio
2      Ohio
3    Nevada
4    Nevada
Name: state, dtype: object

Cloumn Data Update

In [42]:
df2['debt'] = 16.5
df2
Out[42]:
year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
In [43]:
df2['debt'] = np.arange(5)
df2
Out[43]:
year state pop debt
one 2000 Ohio 1.5 0
two 2001 Ohio 1.7 1
three 2002 Ohio 3.6 2
four 2001 Nevada 2.4 3
five 2002 Nevada 2.9 4
In [44]:
df2['debt'] = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df2
Out[44]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

Add Column

In [45]:
df2['eastern'] = df2.state == 'Ohio'
df2
Out[45]:
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False

Delete Column

In [46]:
del df2['eastern']
df2
Out[46]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7

inplace 옵션

  • 함수/메소드는 두 가지 종류
    • 그 객체 자체를 변형
    • 해당 객체는 그대로 두고 변형된 새로운 객체를 출력
  • DataFrame 메소드 대부분은 inplace 옵션을 가짐
    • inplace=True이면 출력을 None으로 하고 객체 자체를 변형
    • inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력
In [47]:
x = [3, 6, 1, 4]
sorted(x)
Out[47]:
[1, 3, 4, 6]
In [48]:
x
Out[48]:
[3, 6, 1, 4]
In [49]:
x.sort()
x
Out[49]:
[1, 3, 4, 6]

drop 메소드를 사용한 Row/Column 삭제

  • del 함수
    • inplace 연산
  • drop 메소드
    • 삭제된 Series/DataFrame 출력
    • Series는 Row 삭제
    • DataFrame은 axis 인수로 Row/Column 선택
      • axis=0(디폴트): Row
      • axis=1: Column
In [50]:
s = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
s
Out[50]:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64
In [51]:
s2 = s.drop('c')
s2
Out[51]:
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64
In [52]:
s
Out[52]:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64
In [53]:
s.drop(["b", "c"])
Out[53]:
a    0.0
d    3.0
e    4.0
dtype: float64
In [54]:
df = pd.DataFrame(np.arange(16).reshape((4, 4)),
                   index=['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns=['one', 'two', 'three', 'four'])
df
Out[54]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
In [55]:
df.drop(['Colorado', 'Ohio'])
Out[55]:
one two three four
Utah 8 9 10 11
New York 12 13 14 15
In [56]:
df.drop('two', axis=1)
Out[56]:
one three four
Ohio 0 2 3
Colorado 4 6 7
Utah 8 10 11
New York 12 14 15
In [57]:
df.drop(['two', 'four'], axis=1)
Out[57]:
one three
Ohio 0 2
Colorado 4 6
Utah 8 10
New York 12 14

Nested dict를 사용한 DataFrame 생성

In [58]:
pop = {
    'Nevada': {
        2001: 2.4, 
        2002: 2.9
    },
    'Ohio': {
        2000: 1.5, 
        2001: 1.7, 
        2002: 3.6
    }
}
In [59]:
df3 = pd.DataFrame(pop)
df3
Out[59]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6

Series dict를 사용한 DataFrame 생성

In [60]:
pdata = {
    'Ohio': df3['Ohio'][:-1],
    'Nevada': df3['Nevada'][:2]
}
pd.DataFrame(pdata)
Out[60]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7

NumPy array로 변환

In [61]:
df3.values
Out[61]:
array([[ nan,  1.5],
       [ 2.4,  1.7],
       [ 2.9,  3.6]])
In [62]:
df2.values
Out[62]:
array([[2000, 'Ohio', 1.5, nan],
       [2001, 'Ohio', 1.7, -1.2],
       [2002, 'Ohio', 3.6, nan],
       [2001, 'Nevada', 2.4, -1.5],
       [2002, 'Nevada', 2.9, -1.7]], dtype=object)

DataFrame의 Column Indexing

  • Single Label key
  • Single Label attribute
  • Label List Fancy Indexing
In [63]:
df2
Out[63]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
In [64]:
df2["year"]
Out[64]:
one      2000
two      2001
three    2002
four     2001
five     2002
Name: year, dtype: int64
In [65]:
df2.year
Out[65]:
one      2000
two      2001
three    2002
four     2001
five     2002
Name: year, dtype: int64
In [66]:
df2[["state", "debt", "year"]]
Out[66]:
state debt year
one Ohio NaN 2000
two Ohio -1.2 2001
three Ohio NaN 2002
four Nevada -1.5 2001
five Nevada -1.7 2002
In [67]:
df2[["year"]]
Out[67]:
year
one 2000
two 2001
three 2002
four 2001
five 2002

질문/덧글

PC에 csv, 엑셀파일 등의 업로드는 어떻게 하나요? minj*** 2016년 6월 23일 10:00 오후

예시에는 이제 패키지에 저장되어 있는 샘플데이를 사용하지만, 만약 다른곳에서 받은 엑셀 또는 csv 파일을 업로드해서 작업을 해야할 때도 있을것 같은데
어떻게 하면되는지 궁금합니다!

답변: PC에 csv, 엑셀파일 등의 업로드는 어떻게 하나요? 관리자 2016년 6월 23일 11:43 오후

주피터 노트북에서 우측 상단에 있는 "Upload" 버튼을 사용하세요. 파일 포맷에 상관없이 가능합니다.