판다스 자료 구조¶
- 분석을 위해 다양한 소스로 부터 수집하는 데이터는 형태나 속성이 매우 다양함
- 서로 다른 형식을 갖는 여러 종류의 데이터를 컴퓨터가 이해 할 수 있도록 동일한 형식을 갖는 구조로 통합 해야함
- Series 와 Dataframe 이라는 구조화된 데이터 형식을 제공
- 서로다른 여러가지 유형의 데이터를 공통의 포맷으로 정리하는 목적
- Dataframe : 행과 열로 이루어진 2차원 구조의 형태로 데이터 분석 실무에 자주 사용됨
(여러 Series가 합쳐진 형태)
1. 시리즈(Series)¶
- 데이터가 순차적으로 나열된 1차원 배열의 형태
- 인덱스(index)는 데이터값(value)와 일대일 대응
- 파이썬의 딕셔너리와 비슷한 구조
딕셔너리 -> 시리즈¶
pandas.Series(딕셔너리)
In [3]:
import pandas as pd
In [4]:
dict_data = {'a':1,'b':2,'c':3}
sr = pd.Series(dict_data)
print(type(sr))
print()
print(sr)
In [5]:
obj = pd.Series([4,7,-5,3]) #인덱스 설정을 안하면 기본적으로 0~으로 설정된다
print(obj)
Series의 index / value¶
- Series객체.index : 인덱스 배열
- Series객체.values : 데이터값 배열
In [6]:
print(obj.values)
print(obj.index)
In [7]:
import pandas as pd
obj2 = pd.Series([4,7,-5,3], index=['d','b','a','c'])
print(obj2)
print(obj2.index)
In [8]:
import numpy as np
import pandas as pd
list_A = np.array(list('abcdef'))
list_B = np.arange(10,70,10)
dict_data = {key: value for key, value in zip(list_A,list_B)}
print(dict_data)
sr = pd.Series(dict_data)
print(sr)
In [9]:
import numpy as np
import pandas as pd
list_A = np.array(list('abcdef'))
list_B = np.arange(10,70,10)
sr = pd.Series(list_B, index = list_A)
print(sr)
for i in range(sr.size):
key = sr.index[i]
print("sr['{}'] : {} or sr[{}] : {}".format(key,sr[key],i, sr.values[i]))
In [10]:
print(sr['a'],sr[0],sr.values[0])
print(sr.index[0])
In [11]:
print(obj2) ; print()
print(obj2[obj2>0])
In [12]:
print(obj2*2)
In [13]:
print(np.exp(obj2))
In [14]:
print('b' in obj2)
print('e' in obj2)
In [15]:
sdata = {'Ohio' : 35000, 'Taxas' : 71000, 'Oregon': 16000 ,'Utah' : 5000}
obj3 = pd.Series(sdata)
print(obj3)
In [16]:
states = ['California','Ohio', 'Taxas', 'Oregon'] #list -> 배정된 순서대로
obj4 = pd.Series(sdata, index=states) #set -> 랜덤순서
print(obj4)
In [17]:
import pandas as pd
print(pd.isnull(obj4))
print(pd.notnull(obj4))
In [18]:
print(obj4.isnull())
In [19]:
print(obj3); print()
print(obj4); print()
print(obj3+obj4)
In [20]:
#print(obj4.name)
obj4.name = 'population'
obj4.index.name = 'state'
print(obj4)
In [21]:
print(obj)
In [22]:
obj.index = ['Bob','Steve','Jeff','Ryan']
print(obj)
2. 데이터프레임(DataFrame)¶
- 2차원 배열
- R의 데이터 프레임에서 유래
- 엑셀, 관계형 DB등에서 사용됨
- 하나의 열이 각각의 Series객체임
행 인덱스/열 이름 설정 :
pandas.DataFrame(2차원 배열, index = 행 인덱스 배열, columns = 열 이름 배열)
In [23]:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
In [24]:
frame
Out[24]:
In [25]:
#행 이름의 순서 변경
pd.DataFrame(data,columns=['year','state','pop'])
Out[25]:
In [26]:
frame2 =pd.DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five','six'])
frame2
Out[26]:
행 인덱스 변경 : DataFrame 객체.rename(index={기존 인덱스:새 인덱스, ...})
열 이름 변경 : DataFrame 객체.rename(colums={기존 이름:새 이름, ...})
In [27]:
frame2.rename(columns={'year':'YEA','state':'STA','pop':'POP','debt':'DEB'},inplace = True)
frame2.head()
frame2.rename(index={'one':'01','two':'02','three':'03','four':'04'},inplace = True)
frame2.head()
Out[27]:
In [28]:
frame2['STA']
Out[28]:
In [29]:
frame.year
Out[29]:
In [30]:
frame2.loc['03']
Out[30]:
In [31]:
frame2.iloc[2]
Out[31]:
In [32]:
frame2['DEB'] = 16.5
frame2
Out[32]:
In [33]:
frame2['DEB'] = np.arange(1,13,2)
frame2
Out[33]:
In [34]:
val = pd.Series([-1.2,-1.5,-1.7],index = ['02','four','six'])
frame2['DEB'] = val
frame2
Out[34]:
In [35]:
frame2['eastern'] = frame2.STA == 'Ohio'
frame2
Out[35]:
In [36]:
frame2['Big_state'] = (frame2.STA == 'Ohio') & (frame2.POP > 3.0)
frame2
Out[36]:
In [37]:
del frame2['eastern']
frame2.head()
Out[37]:
In [38]:
del frame2['Big_state']
frame2.head()
Out[38]:
중첩된 딕셔너리¶
In [39]:
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [40]:
frame3 = pd.DataFrame(pop)
frame3
Out[40]:
In [41]:
frame3.T
Out[41]:
In [42]:
pd.DataFrame(pop,index=[2001,2002,2003])
Out[42]:
In [43]:
print(frame3.iloc[0,0])
print(frame3.iloc[0,1])
print(frame3.iloc[1,0])
print(frame3.iloc[1,1])
In [44]:
frame3.iloc[0,[0,1]]
Out[44]:
In [45]:
frame3.iloc[0,0:]
Out[45]:
In [46]:
pdata = {'Ohio' : frame3['Ohio'][:-1],'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata)
Out[46]:
In [47]:
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')
In [48]:
titanic.head()
Out[48]:
In [49]:
titanic.tail()
Out[49]:
In [50]:
df = titanic.loc[:,['age','fare']]
In [51]:
df.head()
Out[51]:
In [52]:
df.tail()
Out[52]:
In [53]:
df_add10 =df+10
df_add10.head()
Out[53]:
In [54]:
print(type(df_add10))
In [55]:
df_sub = df_add10 - df
df_sub.head()
Out[55]:
In [56]:
obj = pd.Series(range(3),index=['a','b','c'])
index = obj.index
print(index)
index[1:]
Out[56]:
In [57]:
import numpy as np
labels = pd.Index(np.arange(3))
print(labels)
obj2 = pd.Series([1.5,-2.5,0], index = labels)
obj2
Out[57]:
In [58]:
obj2.index is labels
Out[58]:
In [59]:
dup_labels = pd.Index(['foo','foo','bar','bar']) #인덱스가 중복되어도 된다
dup_labels
Out[59]:
In [60]:
obj = pd.Series([4.5,7.2,-5.3,3.6], index = ['d','b','a','c'])
obj
Out[60]:
In [61]:
obj2 = obj.reindex(['d','b','a','c','e'])
obj2
Out[61]:
In [62]:
obj3 = pd.Series(['blue','purple','yellow'], index =[0,2,4])
obj3
Out[62]:
In [63]:
obj3.reindex(range(6),method='ffill')
Out[63]:
In [64]:
import numpy as np
import pandas as pd
frame = pd.DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'], columns = ['Ohio','Texas','California'])
frame
Out[64]:
In [65]:
frame2 = frame.reindex(['a','b','c'])
frame2
Out[65]:
In [66]:
states = ['Texas','Utah','California']
frame.reindex(columns=states)
Out[66]:
In [67]:
obj = pd.Series(np.arange(5.), index = ['a','b','c','d','e'])
obj
Out[67]:
In [68]:
new_obj = obj.drop('c')
new_obj
Out[68]:
In [69]:
new_obj2 = obj.drop(['c','d'])
new_obj2
Out[69]:
In [70]:
data = pd.DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data
Out[70]:
In [71]:
#drop은 기본적으로 행을 삭제한다. 열을 삭제할 경우에는 추가적으로 입력해야함
data.drop(['Colorado','Ohio'])
Out[71]:
In [72]:
data2 = data.drop('two',axis=1)
data2.drop('Utah',axis=0)
Out[72]:
In [73]:
data.drop(['two','four'],axis=1)
Out[73]:
In [74]:
data.drop('two', axis=1)
Out[74]:
In [75]:
data.drop(['Ohio'],axis='rows') # axis = 'rows' or 1은 생략가능
Out[75]:
In [76]:
data.drop('Ohio')
data
Out[76]:
In [77]:
data3 = data.copy()
data3.drop('Ohio',inplace=True)
data3
Out[77]:
인덱싱¶
In [78]:
obj = pd.Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj
Out[78]:
In [79]:
print(obj['b'],obj[1]) ; print()
print(obj[2:4]) ; print()
print(obj[['b','a','d']]) ; print()
print(obj[[1,3]]) ; print()
print(obj<2) ; print()
In [80]:
obj['b':'c'] = 5
obj
Out[80]:
In [81]:
data = pd.DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
data
Out[81]:
In [82]:
data['two']
Out[82]:
In [83]:
data[['three','one']]
Out[83]:
In [84]:
data[:2]
Out[84]:
In [85]:
data[data['three']>5]
Out[85]:
In [86]:
data[data<5] = 0
data
Out[86]:
iloc / loc의 차이
- iloc은 번호로(인덱스 번호)
- loc은 열이름
In [87]:
data.loc['Colorado',['two','three']]
Out[87]:
In [88]:
#two의 Utah까지
data.loc[:'Utah', 'two']
Out[88]:
In [89]:
data.iloc[2,[3,0,1]]
Out[89]:
In [90]:
data.iloc[[1,2],[3,0,1]]
Out[90]:
In [91]:
data
Out[91]:
In [92]:
data.iloc[:,:3][data.three>5]
Out[92]:
In [93]:
ser = pd.Series(np.arange(3.))
ser
Out[93]:
In [94]:
print(ser[:1])
print(ser.loc[:1])
print(ser.iloc[:1])
- np.random.randn : 평균 0, 표준편차가 1인 가우시안 정규분포 난수 matrix 생성
In [95]:
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
Out[95]:
In [96]:
np.abs(frame)
Out[96]:
In [97]:
f = lambda x:x.max()-x.min()
frame.apply(f)
Out[97]:
In [98]:
frame.apply(f, axis='columns')
Out[98]:
In [99]:
def f(x):
return pd.Series([x.min(),x.max()], index=['min','max'])
frame.apply(f)
Out[99]:
Sort Ranking¶
In [100]:
obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])
In [101]:
# index를 기준으로 sort
obj.sort_index()
Out[101]:
In [102]:
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['three', 'one'],
columns=['d', 'a', 'b', 'c'])
frame
Out[102]:
In [103]:
#행을 오름차순으로 정렬
frame.sort_index()
Out[103]:
In [104]:
#열을 오름차순으로 정렬
frame.sort_index(axis=1)
Out[104]:
In [105]:
#역행으로 정렬
frame.sort_index(axis=1,ascending=False)
Out[105]:
In [106]:
obj = pd.Series([4, 7, -3, 2])
In [107]:
#값이 낮은 순서대로 정렬
obj.sort_values()
Out[107]:
In [108]:
frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
frame
Out[108]:
In [109]:
#b를 기준으로 작은 숫자부터 정렬
frame.sort_values(by='b')
Out[109]:
In [110]:
# a를 정렬하고 난 후에 b를 정렬
frame.sort_values(by=['a','b'])
Out[110]:
In [111]:
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
print(obj)
In [181]:
obj.rank()
Out[181]:
In [182]:
obj.rank(method='first')
Out[182]:
In [122]:
# ascending(오름차순) = False -> 내림차순으로 나타냄
# max : 동일 데이터가 여러개 있을 때 큰 것으로 표시
obj.rank(ascending= False, method='max')
Out[122]:
In [126]:
frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],
'c': [-2, 5, 8, -2.5]})
frame
Out[126]:
In [129]:
#한 행에 있는 열 값을 정렬
frame.rank(axis=1)
Out[129]:
In [186]:
obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
obj
Out[186]:
In [187]:
obj.index.is_unique
Out[187]:
In [188]:
obj['a']
Out[188]:
In [189]:
obj['c']
Out[189]:
In [131]:
df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
df
Out[131]:
In [132]:
df.loc['b']
Out[132]:
In [133]:
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
[np.nan, np.nan], [0.75, -1.3]],
index=['a', 'b', 'c', 'd'],
columns=['one', 'two'])
df
Out[133]:
In [134]:
df.sum()
Out[134]:
In [135]:
df.sum(axis='columns')
Out[135]:
In [138]:
# skipna : NaN값을 제외하고 계산
df.mean(axis='columns',skipna=False)
Out[138]:
In [139]:
# 최대, 최소값을 가지고 있는 index를 반환
df.idxmax()
Out[139]:
In [140]:
# 누적합
df.cumsum()
Out[140]:
In [200]:
df.describe()
Out[200]:
Unique Values, Value Counts, and Membership¶
In [202]:
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
obj
Out[202]:
In [203]:
uniques = obj.unique()
uniques
Out[203]:
In [204]:
obj.value_counts()
Out[204]:
In [205]:
pd.value_counts(obj.values,sort=False)
Out[205]:
In [206]:
obj
Out[206]:
In [207]:
# b,c가 안에 있는지
mask = obj.isin(['b','c'])
mask
Out[207]:
In [208]:
obj[mask]
Out[208]:
In [213]:
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
to_match
Out[213]:
In [214]:
unique_vals = pd.Series(['c', 'b', 'a'])
unique_vals
Out[214]:
In [216]:
pd.Index(unique_vals).get_indexer(to_match)
Out[216]:
In [233]:
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
In [234]:
data
Out[234]:
In [235]:
#각 열의 숫자가 몇 번 카운트되었는지
result = data.apply(pd.value_counts).fillna(0)
result
Out[235]:
isin : Series의 각 원소가 넘겨받은 연속된 값에 속하는 지 나타내는 bool배열을 반환
match : 각 값에 대해 유일한 값을 담고 있는 배열에서의 정수 색인을 계산.
unique : Series에서 중복되는 값을 제거하고 유일한 값만 포함하는 배열을 반환
value_count : Series에서 유일값에 대한 색인과 두수를 계산 (도수는 내림차순)
In [236]:
data['Qu1'].value_counts()[:2]
Out[236]:
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important; }</style>"))
In [ ]:
'Python' 카테고리의 다른 글
09.Python Pandas - csv,xlsx (0) | 2020.09.10 |
---|---|
Python pandas 음식점 예제 (0) | 2020.09.09 |
07.Python matplotlib (0) | 2020.09.08 |
06.Python(Numpy 행렬) (0) | 2020.09.08 |
05.Python Numpy (0) | 2020.09.07 |
댓글