PYTHON

[빅데이터 분석] 2021.12.17 Pandas

죠으니 2021. 12. 19. 23:06

 히히 열심히 놀고 다음날 복습하기~~!!

낮잠도 자고 카페가서 놀기도 하고 아주 행복한 시간을 보냈다. 

수업시간에 자기소개를 했는데 다들 좋은 사람처럼 보였다.

나중에 같이 공모전도 나가고 하려면 내가 더 열심히 배워야겠다라는 생각이 들었다. 

 

<Missing data>

▶np.nan이 있으면 데이터가 빠져있는 것이다. 이건 계산 안 하고 없는 셈친다.

list(df.columns)

['A', 'B', 'C', 'D', 'F']

▶df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1
# reindex 다시 인덱스를 매긴다는 것

Timestamp('2013-01-01 00:00:00', freq='D')

freq 는 기간을 의미. 'D'는 date(일)을 의미.

lociloc의 차이점

☞ loc: 칼럼명을 직접 적거나 특정 조건식을 써줌으로써 데이터에 접근.

         df.loc[0]은 전체 데이터 프레임에서 인덱스 이름이 0인 행만 추출하라는 뜻.

☞ iloc: 데이터 프레임의 행이나 칼럼의 순서를 나타내는 정수로 특정값을 추출. 숫자로 데이터가 있는 위치에 접근.     

          정수값만 들어가야함에도 불구하고 문자열로 값을 입력하게 되면 에러가 뜬다.

          df.iloc[행 인덱스, 열 인덱스]

          df.iloc[0]은 전체 데이터 프레임에서 0번째 행에 있는 값들만 추출하라는 뜻

▶df1.loc[dates[0]:dates[1], 'E'] = 1 E에 1을 넣는것

▶df1.dropna(how='any')

☞ nan값이 있는 행들을 모두 삭제. 데이터가 빠져있는걸 모두 삭제

☞ 하나만 nan이 들어있는 행을 다 삭제하는것
    all은 다 nan이면 삭제하는것

shift+tab을 누르면 정보가 나옴

▶df1.fillna(value=5)

☞ nan값이 있는 자리에 value를 채우기

▶pd.isna(df1)

☞ nan값이 있는지 확인하기. true 라고 나오는게 nan이다

▶nan = na = null 파이썬은 이것들을 다 같게 생각함. 다 같은 뜻

▶df1.info() #이걸로도 정보를 알 수 있음. nan이 있는지 없는지

 

<Operations>

(1) Stats(통계 데이터)

▶df1.mean(0) 행 기준으로 평균을 낸 것. 0은 행 기준이다.

▶series는 어떤 데이터 타입이든 보유할 수 있는 레이블링된 1차원의 배열.

 s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates)

2013-01-01    1.0
2013-01-02    3.0
2013-01-03    5.0
2013-01-04    NaN
2013-01-05    6.0
2013-01-06    8.0
Freq: D, dtype: float64

▶s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2) 두칸 밑으로 내렸음 그래서 위에 두 칸이 비어있다.

  shift는 이동. 몇칸을 이동할지 

2013-01-01    NaN
2013-01-02    NaN
2013-01-03    1.0
2013-01-04    3.0
2013-01-05    5.0
2013-01-06    NaN
Freq: D, dtype: float64

▶df.sub(s, axis='index')  /  sub: 빼다(마이너스)

☞ df의 각 값들에서 s를 뺀다. 

☞ nan에서 nan을 빼니 위에 두칸이랑 밑에꺼는 다 nan이 됨

(2) Apply

▶모든 데이터 값들을 통계내는 것.

▶df.apply(np.cumsum)

☞ 밑으로 갈수록 누적 합계

▶df.apply(lambda x: x.max() - x.min())

☞ 각 열마다 최댓값-최솟값

 

(3)Histogramming

▶np.random.randint(0, 7, size=10) 랜덤이라 계속 바뀜

   randint는 정수를 만드는 것이라는 뜻

array([5, 6, 2, 2, 3, 2, 1, 3, 0, 3])

▶s = pd.Series(np.random.randint(0, 7, size=10)) 

▶s[0] #index를 넣어 값을 찾는것

▶s.value_counts() #값이 몇개씩 있는지를 보는 것

 

(4) String Methods

▶s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']

 

<Merge>

(1)Concat

▶df = pd.DataFrame(np.random.randn(10, 4))

▶pieces = [df[:3], df[3:7], df[7:]] 쪼개는 것

▶pd.concat(pieces)  쪼갠것을 다시 합치는 것

 

(2)Merge

▶left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})

right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})

pd.merge(left, right, on='key')

 

<Grouping>

(1) groupby

▶df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                   'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C': np.random.randn(8), 'D': np.random.randn(8)})

▶df.groupby('A').sum() foo끼리 bar끼리 합친 것

▶df.groupby(['A', 'B']).sum()

 

<Reshaping>

▶zip : 파이썬 내장함수
zip() : 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수

# zip 함수 사용법
Number_Name = list(zip([1,2,3,4], ['hong','gil','dong','nim']))

[(1, 'hong'), (2, 'gil'), (3, 'dong'), (4, 'nim')]

(1)Stack

▶list(zip([['bar', 'bar', 'baz', 'baz','foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two','one', 'two', 'one', 'two']]))

[(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],),
 (['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'],)]

▶list(zip(*[['bar', 'bar', 'baz', 'baz','foo', 'foo', 'qux', 'qux'],
           ['one', 'two', 'one', 'two','one', 'two', 'one', 'two']]))

반복 가능한 객체에 별표(Asterisk, *)를 함께 사용한다면, 언패킹되어 묶여있던 객체들이 나눠지게 됩니다.

▶index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])

▶stacked = df2.stack()  stack()을 하면 데이터를 쌓아서 보여줌

▶stacked.unstack() unstack()를 하면 원상복귀

 

(2)Pivot tables

▶df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
                   'B': ['A', 'B', 'C'] * 4,
                   'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
                   'D': np.random.randn(12),
                   'E': np.random.randn(12)})

▶pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
#c의  bar, foo를 column으로 바꾼것

 

<엑셀 다루는 판다스>

새 column 추가하기 (맨 마지막에 컬럼 추가)

▶df = pd.DataFrame(np.arange(16).reshape(4,4),
                  index=None,
                  columns=['price', 'qty', 'price', 'qty'])
# np.arange(16).reshape(4,4) 0부터 16 데이터를 배열하는데 4행4열로 배열하는 것
#columns=['price', 'qty', 'price', 'qty'] 컬럼 이름을 정하는 것

▶df['name'] = '-' #name 자리에 -가 다 추가됨

 원하는 위치에 컬럼 추가하기

df.insert(loc, column, value, allow_duplicates=False)

▶df.insert(2, 'name', '-', allow_duplicates=False)

기본 테이블을 멀티 컬럼, 인덱스로 바꾸기

▶import pandas as pd
df2 = pd.DataFrame(df1.values,
                   index = df1.index, 
                   columns = [['apple','apple','banana','banana'], ['price','qty','price','qty']])  2중 칼럼으로 만들기
column에 이중으로 []함

(이름으로) 행,열 삭제

 

▶df2 = df.drop(['price'], axis=1) #열중에 price라는 열을 삭제

 

(인덱스로) n번째 행 삭제

▶df2 = df.drop(df.index[0], axis=0)

 

마지막 행에 컬럼 별 합계 삽입

▶df.loc['합계'] = [df[df.columns[x]].sum() for x in range(0, len(df.columns))]

<데이터프레임으로 만들기>

(1) 튜플을 데이터프레임으로

▶import pandas as pd

data = [('p1', 't1', 1, 2), ('p1', 't2', 3, 4), ('p2', 't1', 5, 6), ('p2', 't2', 7, 8), ('p2', 't3', 2, 8)]
df = pd.DataFrame(data)

▶fillna(-999) nan 값은 -999값으로 채우기

sort_index() 인덱스를 기준으로 정렬

  sort_values() 컬럼 값을 기준으로 데이터를 정렬

// 몫이라는 뜻

▶ to_datetime 은 데이터 타임 형태로 바꿀 때만 쓴다.

  astype()은 ()안에 float 등등 뭘 넣든 데이터 타임말고 다른 것들로도 다 바꿀 수 있다.