판다스 정리

Series (시리즈)

In [2]:
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important;}</style>"))
In [3]:
import pandas as pd

# dictionary -> Series
dict_data = {'a':'hello','b':np.nan,'c':3}
sr = pd.Series(dict_data)
print(type(sr))
print(sr)
<class 'pandas.core.series.Series'>
a    hello
b      NaN
c        3
dtype: object
In [4]:
# list -> Series
sr2 = pd.Series(['2020-07-15',True,5.8])
print(type(sr2))
print(sr2)
<class 'pandas.core.series.Series'>
0    2020-07-15
1          True
2           5.8
dtype: object
In [5]:
# 인덱스, 데이터값 확인
print(sr.index,sr2.index)
print(sr.values,sr2.values)
Index(['a', 'b', 'c'], dtype='object') RangeIndex(start=0, stop=3, step=1)
['hello' nan 3] ['2020-07-15' True 5.8]
In [6]:
# tuple -> Series
tuple_data = ('홍길동','남',50,False)
sr3 = pd.Series(tuple_data,index=['이름','성별','나이','결혼여부'])
print(sr3)
print()

print(sr3[0]) # == sr3['이름']
print()

print(sr3[[0,1]]) # == sr3[['이름','성별']]
print()

print(sr3[0:3]) # == sr3['이름':'나이']
print()

# print(sr3[[0:2]]) 오류남
이름        홍길동
성별          남
나이         50
결혼여부    False
dtype: object

홍길동

이름    홍길동
성별      남
dtype: object

이름    홍길동
성별      남
나이     50
dtype: object

시리즈 연산

In [51]:
student1 = pd.Series([np.nan,100,50],index=['국어','수학','영어'])
print(student1)
print()

student2 = pd.Series([20,80],index=['국어','수학'])
print(student2)
print()

# fill_value=0 덕에 비어있는 값들을 0으로 만들어줘서 연산이 가능함
st_add = student1.add(student2,fill_value=0)
st_sub = student1.sub(student2,fill_value=0)
st_mul = student1.mul(student2,fill_value=0)
st_div = student1.div(student2,fill_value=0)

# 비어있는 값들(NaN) 때문에 연산이 제대로 되지 않음
st_add2 = student1 + student2
st_sub2 = student1 - student2
st_mul2 = student1 * student2
st_div2 = student1 / student2

result = pd.DataFrame([st_add,st_add2,st_sub,st_sub2,st_mul,st_mul2,st_div,st_div2],
                      index=['+','+','-','-','*','*','/','/'])
result
국어      NaN
수학    100.0
영어     50.0
dtype: float64

국어    20
수학    80
dtype: int64

Out[51]:
국어 수학 영어
+ 20.0 180.00 50.0
+ NaN 180.00 NaN
- -20.0 20.00 50.0
- NaN 20.00 NaN
* 0.0 8000.00 0.0
* NaN 8000.00 NaN
/ 0.0 1.25 inf
/ NaN 1.25 NaN

DataFrame (데이터프레임)

In [7]:
dates = pd.date_range('20200705',periods=3)
print(dates)

dict_data = {'A':0,'B':1,'C':2,'D':3}

df = pd.DataFrame([[1,2,3,4],[2,3,4,5],[3,4,5,6]],index=dates,columns=dict_data.keys())
df
DatetimeIndex(['2020-07-05', '2020-07-06', '2020-07-07'], dtype='datetime64[ns]', freq='D')
Out[7]:
A B C D
2020-07-05 1 2 3 4
2020-07-06 2 3 4 5
2020-07-07 3 4 5 6
In [39]:
df2 = pd.DataFrame(np.arange(12).reshape(3,4),index=dates,columns=list('abcd'))
df2
Out[39]:
a b c d
2020-07-05 0 1 2 3
2020-07-06 4 5 6 7
2020-07-07 8 9 10 11
In [9]:
df3 = pd.DataFrame({'A':1,
                    'B':pd.date_range('20200715',periods=4),
                    'C':pd.Series(3,index=list(range(4)),dtype='float'),
                    'D':pd.Categorical(['hi','my','name','is']),
                    'F':'dewy'})
df3
Out[9]:
A B C D F
0 1 2020-07-15 3.0 hi dewy
1 1 2020-07-16 3.0 my dewy
2 1 2020-07-17 3.0 name dewy
3 1 2020-07-18 3.0 is dewy
In [10]:
# DataFrame 컬럼 타입 보여줌
df3.dtypes
Out[10]:
A             int64
B    datetime64[ns]
C           float64
D          category
F            object
dtype: object
In [11]:
# DataFrame에 대한 통계 정보 보여줌
df.describe()
Out[11]:
A B C D
count 3.0 3.0 3.0 3.0
mean 2.0 3.0 4.0 5.0
std 1.0 1.0 1.0 1.0
min 1.0 2.0 3.0 4.0
25% 1.5 2.5 3.5 4.5
50% 2.0 3.0 4.0 5.0
75% 2.5 3.5 4.5 5.5
max 3.0 4.0 5.0 6.0
In [12]:
# 전치 .T는 속성이므로 괄호() 안씀 (오류남)
df.T
Out[12]:
2020-07-05 2020-07-06 2020-07-07
A 1 2 3
B 2 3 4
C 3 4 5
D 4 5 6
In [13]:
df
Out[13]:
A B C D
2020-07-05 1 2 3 4
2020-07-06 2 3 4 5
2020-07-07 3 4 5 6
In [14]:
# 정렬
df.sort_index(axis=0,ascending=False)
Out[14]:
A B C D
2020-07-07 3 4 5 6
2020-07-06 2 3 4 5
2020-07-05 1 2 3 4
In [15]:
df.sort_index(axis=1,ascending=False)
Out[15]:
D C B A
2020-07-05 4 3 2 1
2020-07-06 5 4 3 2
2020-07-07 6 5 4 3
In [16]:
df.sort_values(by='A',ascending=False)
Out[16]:
A B C D
2020-07-07 3 4 5 6
2020-07-06 2 3 4 5
2020-07-05 1 2 3 4

cloumns, index 이름 바꾸기

In [17]:
df.columns = ['가','나','다','라']
df.index = ['a','b','c']

df
Out[17]:
a 1 2 3 4
b 2 3 4 5
c 3 4 5 6
In [18]:
# inplace = True를 해야 원본 데이터 바뀜
df.rename(columns={'가':'a','나':'b','다':'c','라':'d'},inplace=True)
df.rename(index={'a':'A','b':'B','c':'C'},inplace=True)

df
Out[18]:
a b c d
A 1 2 3 4
B 2 3 4 5
C 3 4 5 6

columns, index 삭제

In [19]:
# axis=0 : 행 / axis=1 : 열
df.drop('A')
Out[19]:
a b c d
B 2 3 4 5
C 3 4 5 6
In [20]:
df.drop('a',axis=1)
Out[20]:
b c d
A 2 3 4
B 3 4 5
C 4 5 6
In [21]:
df.drop(['b','d'],axis=1,inplace=True)
df
Out[21]:
a c
A 1 3
B 2 4
C 3 5
In [22]:
df4 = df
df4
Out[22]:
a c
A 1 3
B 2 4
C 3 5

columns, index 선택

In [23]:
df3
Out[23]:
A B C D F
0 1 2020-07-15 3.0 hi dewy
1 1 2020-07-16 3.0 my dewy
2 1 2020-07-17 3.0 name dewy
3 1 2020-07-18 3.0 is dewy
In [24]:
# 행(index)은 slice 사용 가능
df5 = df3[0:3]
df5
Out[24]:
A B C D F
0 1 2020-07-15 3.0 hi dewy
1 1 2020-07-16 3.0 my dewy
2 1 2020-07-17 3.0 name dewy
In [25]:
# 열(columns)은 컬럼명으로 해야함
df6 = df3[['A','C','F']]
df6
Out[25]:
A C F
0 1 3.0 dewy
1 1 3.0 dewy
2 1 3.0 dewy
3 1 3.0 dewy
In [26]:
# 특정 열(컬럼) 선택
print(df3.F) # = df3['B']


# 특정 행(인덱스) 선택
df3[0:1] # 특정 행을 선택하기 위해서는 한개를 호출할지라도 반드시 범위로 표현해줘야함
0    dewy
1    dewy
2    dewy
3    dewy
Name: F, dtype: object
Out[26]:
A B C D F
0 1 2020-07-15 3.0 hi dewy

loc : 이름을 이용하여 선택하기

In [27]:
df2.loc['2020-07-05':'2020-07-07','a':'c'] # == df2.loc[dates[0:3],'a':'c']
Out[27]:
a b c
2020-07-05 0 1 2
2020-07-06 4 5 6
2020-07-07 8 9 10
In [71]:
print(df3.loc[0,:])

df3.loc[[0,1,2],:]
A                      1
B    2020-07-15 00:00:00
C                      3
D                     hi
F                   dewy
Name: 0, dtype: object
Out[71]:
A B C D F
0 1 2020-07-15 3.0 hi dewy
1 1 2020-07-16 3.0 my dewy
2 1 2020-07-17 3.0 name dewy
In [53]:
df2.loc[:,['a','c']]
Out[53]:
a c
2020-07-05 0 2
2020-07-06 4 6
2020-07-07 8 10
In [28]:
# 특정 값 하나만 추출하기 위해서는 .at을 써도 된다.
df2.loc['2020-07-05','a'] # == df2.at['2020-07-05','a']
Out[28]:
0

iloc : 위치를 이용하여 선택하기

In [29]:
print(df2.iloc[2]) # 인덱스 2번째 (2020-07-07) 데이터 추출
df2.iloc[0:3,2:4]
a     8
b     9
c    10
d    11
Name: 2020-07-07 00:00:00, dtype: int32
Out[29]:
c d
2020-07-05 2 3
2020-07-06 6 7
2020-07-07 10 11
In [30]:
# 특정 열(컬럼)에 대해서 추출
df2.iloc[:,1:3]
Out[30]:
b c
2020-07-05 1 2
2020-07-06 5 6
2020-07-07 9 10
In [31]:
# 특정 행(인덱스)에 대해서 추출
df2.iloc[0:2,:]
Out[31]:
a b c d
2020-07-05 0 1 2 3
2020-07-06 4 5 6 7
In [32]:
# 특정 위치에 대해서만 추출
df2.iloc[[0,2],[0,2]]
Out[32]:
a c
2020-07-05 0 2
2020-07-07 8 10
In [33]:
# 특정 값 하나만 추출하기 위해서는 .iat을 써도 된다.
df2.iloc[1,1] # == df2.iat[1,1]
Out[33]:
5

columns, index 추가

In [34]:
# 열(컬럼) 추가
df['E']=10
df
Out[34]:
a c E
A 1 3 10
B 2 4 10
C 3 5 10
In [35]:
# 행(인덱스) 추가
df.loc['K'] = 5
df
Out[35]:
a c E
A 1 3 10
B 2 4 10
C 3 5 10
K 5 5 5
In [36]:
# 특정 값 바꾸기
df.iloc[0,0] = 100
df
Out[36]:
a c E
A 100 3 10
B 2 4 10
C 3 5 10
K 5 5 5

+ Recent posts