판다스 자료 구조¶
- 분석을 위해 다양한 소스로부터 수집하는 데이터는 형태나 속성이 매우 다양함
- 서로 다른 형식을 갖는 여러 종류의 데이터를 컴퓨터가 이해 할 수 있도록 동일한 형식을 갖는 구조로 통합 해야함
- Series(1차원) 와 Dataframe(2차원) 이라는 구조화된 데이터 형식을 제공
- 서로다른 여러가지 유형의 데이터를 공통의 포맷으로 정리하는 목적
- Dataframe : 행과 열로 이루어진 2차원 구조의 형태로 데이터 분석 실무에 자주 사용됨
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,1,2,3.. 나옴
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)
In [9]:
sr=pd.Series(dict_data)
sr
Out[9]:
In [10]:
# 위의 과정보다 간편
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)
for i in range(sr.size):
key=sr.index[i]
print("sr['{}'] : {} or sr[{}] : {}".format(key,sr[key],i, sr.values[i]))
In [11]:
print(sr['a'], sr[0], sr.values[0]) # 같은 값
In [12]:
print(sr.index[0])
In [13]:
print(obj2)
print()
print(obj2[obj2>0])
print()
print(obj2*2)
print()
print(np.exp(obj2))
In [14]:
print('b' in obj2)
print('e' in obj2)
In [15]:
sdata= {'ohio':35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}
obj3=pd.Series(sdata)
print(obj3)
In [16]:
states= ['Callifornia', 'ohio','Texas','Oregon']
print(type(states))
obj4=pd.Series(sdata, index=states)
print(obj4)
In [17]:
import pandas as pd
print(pd.isnull(obj4)) #비어있냐
print()
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객체임
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]:
frame.head()
Out[25]:
In [26]:
frame.tail()
Out[26]:
In [27]:
#column의 순서를 바꿀 수 있음
pd.DataFrame(data, columns=['year','state','pop'])
Out[27]:
행 인덱스/ 열 이름 설정: pandas.DataFrame(2차원 배열, index=행 인덱스 배열, colimns=열 이름 배열)¶
In [28]:
import pandas as pd
frame2= pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
Out[28]:
In [33]:
print(frame2.columns)
In [34]:
frame2.rename(columns={'year': 'YEA', 'state':'STA', 'pop':'POP', 'debt':'DEBT'}, inplace=True)
frame2.rename(index={'one': '01', 'two':'02'}, inplace=True)
frame2
Out[34]:
In [35]:
frame2['STA']
Out[35]:
In [36]:
frame2.YEA
Out[36]:
.iloc[[행],[열]]¶
- Data의 행 번호 활용, integer만 가능
### .loc[[행],[열]] - DataFrame index 활용, 아무 것이나 활용 가능
In [37]:
frame2
Out[37]:
In [38]:
frame2.loc['three']
Out[38]:
In [39]:
frame2.iloc[2]
Out[39]:
In [40]:
frame2['DEB']=16.5 #한 열의 값을 통째로 바꿈
frame2
Out[40]:
In [41]:
frame2['DEB']=np.arange(1,13,2)
frame2
Out[41]:
In [42]:
val=pd.Series([-1.2,-1.5,-1.7], index=['02', 'four', 'six'])
frame2['DEB']=val
frame2
Out[42]:
In [43]:
frame2['eastern']=frame2.STA=='Ohio'
frame2
Out[43]:
In [44]:
frame2['Big_State']=(frame2.STA=='Ohio') & (frame2.POP>3.0)
frame2
Out[44]:
In [45]:
del frame2['eastern']
frame2
Out[45]:
In [46]:
del frame2['Big_State']
frame2
Out[46]:
중첩된 딕셔너리¶
In [47]:
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [48]:
frame3= pd.DataFrame(pop)
frame3
Out[48]:
In [49]:
frame3.T
Out[49]:
In [50]:
pd.DataFrame(pop, index=[2001,2002,2003])
Out[50]:
In [51]:
frame3
Out[51]:
In [52]:
print(frame3.iloc[0,0])
print(frame3.iloc[0,1])
print(frame3.iloc[1,0])
print(frame3.iloc[1,1])
In [53]:
frame3.iloc[0,[0,1]]
Out[53]:
In [54]:
frame3.iloc[0,0:]
Out[54]:
In [55]:
pdata= {'Ohio' : frame3['Ohio'][:-1], 'Nevada' : frame3['Nevada'][:-2]}
pd.DataFrame(pdata)
Out[55]:
In [56]:
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')
In [57]:
titanic.head()
Out[57]:
In [58]:
titanic.tail()
Out[58]:
In [59]:
df = titanic.loc[:,['age', 'fare']]
In [60]:
df.head()
Out[60]:
In [61]:
df.tail()
Out[61]:
In [62]:
df_add10= df+ 10
In [63]:
df_add10.head()
Out[63]:
In [64]:
print(type(df_add10))
In [65]:
df_sub= df_add10-df
df_sub
Out[65]:
색인¶
In [66]:
obj=pd.Series(range(3), index=['a', 'b', 'c'])
index= obj.index
print(index)
index[1:]
Out[66]:
In [67]:
import numpy as np
import pandas as pd
labels=pd.Index(np.arange(3))
print(labels)
print()
obj2=pd.Series([1.5, -2.5, 0], index=labels)
print(obj2)
In [68]:
obj2.index is labels
Out[68]:
In [69]:
dup_labels=pd.Index(['foo', 'foo', 'bar', 'bar']) #중복 가능
dup_labels
Out[69]:
In [70]:
obj=pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj
Out[70]:
In [71]:
obj2=obj.reindex(['a','b','c','d','e'])
obj2
Out[71]:
In [72]:
obj3=pd.Series(['blue', 'purple', 'yellow'], index=[0,2,4])
obj3
Out[72]:
In [73]:
obj3.reindex(range(6), method="ffill") #Nan 값을 앞의 값으로 채운다
Out[73]:
In [74]:
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[74]:
In [75]:
frame2= frame.reindex(['a','b','c','d'])
frame2
Out[75]:
In [76]:
states=['Texas', 'Utah', 'California']
frame.reindex(columns=states)
Out[76]:
In [77]:
obj=pd.Series(np.arange(5.), index=['a','b','c','d','e'])
obj
Out[77]:
In [78]:
new_obj= obj.drop('c')
new_obj
Out[78]:
In [79]:
new_obj2=obj.drop(['d', 'c'])
new_obj2
Out[79]:
In [80]:
data=pd.DataFrame(np.arange(16).reshape((4,4)), index= ['Ohio','Colorado','Utah', 'New York'] ,columns=['one', 'two','three', 'four'])
data
Out[80]:
In [81]:
data.drop(['Colorado', 'Ohio']) # drop은 행을 삭제함
Out[81]:
In [82]:
data.drop('two', axis=1) # 열 삭제
Out[82]:
In [83]:
data2= data.drop('two', axis=1)
data2.drop('Utah', axis=0)
Out[83]:
In [84]:
data.drop(['two','four'], axis = 1)
Out[84]:
In [85]:
data.drop('Ohio', axis='rows') #axis='rows or axis=0은 생략가능
Out[85]:
In [86]:
data.drop('Ohio')
Out[86]:
In [87]:
data
Out[87]:
In [88]:
data3=data.copy()
data3.drop("Ohio", inplace=True)
data3
Out[88]:
인덱싱¶
In [89]:
obj= pd.Series(np.arange(4.), index=['a','b','c','d'])
obj
Out[89]:
In [90]:
print(obj['b'], obj[1]); print()
print(obj[2:4])
print(obj[['b','a','d']])
print(obj[[1,3]]); print()
print((range(4),obj.index is obj))
In [91]:
obj['b':'c']=5
obj
Out[91]:
In [92]:
data = pd.DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
data
Out[92]:
In [93]:
data['two']
Out[93]:
In [94]:
data[['three','one']]
Out[94]:
In [95]:
data[:2]
Out[95]:
In [96]:
data[data['three']>5]
Out[96]:
In [97]:
data[data<5] =0 #data<5 True, True는 0으로 바뀜
data
Out[97]:
In [98]:
data.loc['Colorado', ['two', 'three']]
Out[98]:
In [99]:
data
Out[99]:
In [100]:
data.iloc[2,[3,0,1]]
Out[100]:
In [101]:
data.iloc[[1,2], [3,0,1]]
Out[101]:
In [102]:
data.loc[:'Utah', 'two']
Out[102]:
In [103]:
data.iloc[:,:3][data.three>5]
Out[103]:
In [104]:
ser = pd.Series(np.arange(3.))
ser
Out[104]:
In [105]:
ser[:1]
ser.loc[:1]
ser.iloc[:1]
Out[105]:
In [106]:
print(ser[:1]); print()
print(ser.loc[:1]); print() #숫자1
print(ser.iloc[:1])
In [107]:
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
Out[107]:
In [108]:
np.abs(frame) #절대값
Out[108]:
np.random.randn : 평균 0 표준편차가 1인 가우시안 정규분포 난수 matrix 생성
In [109]:
f=lambda x:x.max()-x.min()
frame.apply(f)
Out[109]:
In [110]:
frame.apply(f, axis='columns')
Out[110]:
In [111]:
frame
Out[111]:
In [112]:
def f(x):
return pd.Series([x.min(), x.max()], index=['min','max'])
frame.apply(f)
Out[112]:
In [113]:
obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])
obj
Out[113]:
index를 기준으로 sorting¶
In [114]:
obj.sort_index()
Out[114]:
In [115]:
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['three', 'one'],
columns=['d', 'a', 'b', 'c'])
frame
Out[115]:
In [116]:
frame.sort_index() #행을 정렬(오름차순)
Out[116]:
In [117]:
frame.sort_index(axis=1) #열을 정렬
Out[117]:
In [118]:
frame.sort_index(axis='columns') #열을 정렬
Out[118]:
In [119]:
frame.sort_index(axis='columns',ascending=False) #내림차순 정렬
Out[119]:
In [120]:
frame.sort_index(axis='columns',ascending=True) #오름차순 정렬
Out[120]:
In [121]:
obj = pd.Series([4, 7, -3, 2])
obj
Out[121]:
In [122]:
obj.sort_values() # 값이 낮은 기준으로 정렬
Out[122]:
In [123]:
frame = pd.DataFrame({'b': [4, 7, -3, 8], 'a': [0, 1, 2, 3]})
frame
Out[123]:
In [124]:
frame.sort_values(by=['b','a']) #b를 기준으로 정렬
Out[124]:
In [125]:
frame.sort_values(by=['a','b']) # a를 기준으로 먼저 정렬하고 b 정렬
Out[125]:
In [126]:
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj
Out[126]:
In [127]:
obj.rank() #순위
Out[127]:
In [128]:
obj.rank(method='first') #먼저 온 순서대로 (중복없음)
Out[128]:
In [129]:
obj
Out[129]:
In [130]:
obj.rank(ascending=False, method='max') # ex) 0과 2가 2로 공동1등이라서 1.5로 적었지만 max를 쓰면 2로 표기됨
Out[130]:
In [131]:
frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],
'c': [-2, 5, 8, -2.5]})
frame
Out[131]:
In [132]:
frame.rank(axis='columns') # 한 행에 있는 열 값을 기준으로 순서 매김
Out[132]:
In [133]:
obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
obj
Out[133]:
In [134]:
obj.index.is_unique #a와 b 중복되서 False
Out[134]:
In [135]:
obj['a']
Out[135]:
In [136]:
obj['c']
Out[136]:
In [137]:
df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
df
Out[137]:
In [138]:
df.loc['b']
Out[138]:
In [139]:
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[139]:
In [140]:
df.sum()
Out[140]:
In [141]:
df.sum(axis='columns')
Out[141]:
In [142]:
df.mean(axis='columns', skipna=False) #NAN을 skip할건지말건지
Out[142]:
In [143]:
df.mean(axis='columns',skipna=True) #skipna=True 기본값이라 생략가능
Out[143]:
In [144]:
df.idxmax()
Out[144]:
In [145]:
df.idxmin()
Out[145]:
In [146]:
df
Out[146]:
In [147]:
df
Out[147]:
In [148]:
df.cumsum() #누적 합
Out[148]:
In [149]:
df.describe()
Out[149]:
Unique Values, Value Counts, and Membership¶
In [150]:
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
obj
Out[150]:
In [151]:
uniques= obj.unique()
uniques
Out[151]:
In [152]:
obj.value_counts()
Out[152]:
In [153]:
pd.value_counts(obj.values,sort=False)
Out[153]:
In [154]:
pd.value_counts(obj.values,sort=True)
Out[154]:
In [155]:
obj
Out[155]:
In [156]:
mask=obj.isin(['b','c'])
mask
Out[156]:
In [157]:
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
to_match
Out[157]:
In [158]:
unique_vals = pd.Series(['c', 'b', 'a'])
unique_vals
Out[158]:
In [159]:
pd.Index(unique_vals).get_indexer(to_match) #unique_vals의 c=0 b=1 a=2로 값을 정하고 to_match에서 적용
Out[159]:
In [166]:
data = pd.DataFrame({'Qu1': [5, 1, 4, 5, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
In [161]:
data
Out[161]:
In [162]:
data['Qu1'].value_counts()
Out[162]:
In [163]:
data['Qu1'].value_counts()[:1]
Out[163]:
In [164]:
data['Qu1'].value_counts()[1:]
Out[164]:
In [167]:
result = data.apply(pd.value_counts).fillna(0) # 위의 값 count 확인, fillna(0) : 없는 값은 0으로 바꿔줌
result
Out[167]:
- isin : Series의 각 원소가 넘겨받은 연속된 값에 속하는지 나타내는 bool배열을 반환
- match : 각 값에 대해 유일한 값을 담고 있는 배열에서의 정수 색인을 계산.
- unique : Series에서 중복되는 값을 제거하고 유일한 값만 포함하는 배열을 반환
- value_count : Series에서 유일값에 대한 색인과 두수를 계산 (도수는 내림차순)
'Python' 카테고리의 다른 글
python_pandas(판다스): 계층적 색인 지정, 누락된 데이터처리, 결측치채우기, 데이터 변형하기, onehot인코딩 (0) | 2020.09.11 |
---|---|
Python_pandas 문제 (0) | 2020.09.09 |
Python 기초09_vectorize (0) | 2020.09.08 |
Python 기초08_matplotlib(그래프 그리기,subplots,meshgrid) (0) | 2020.09.08 |
Python 기초07_Numpy2 (0) | 2020.09.08 |