pandas concat(연결), 결측치, 이상치, 중복행

2021. 8. 23. 19:13python/pandas, numpy

728x90

# 이번에는 merge말고 연결(concat)에 대해서 알아보아요!

merge는 연관성이 있는것끼리 연결, concat는 단순연결

 

 

concat(연결)

 

 

# Series를 연결해 보아요!

import numpy as np
import pandas as pd

s1 = pd.Series([0,1], index=['a','c'])
s2 = pd.Series([4,3,2], index=['b','c','e'])
s3 = pd.Series([5,6], index=['f','g'])

print(s1)
print(s2)
print(s3)

 


# s4 = pd.concat([s1,s2,s3], axis=0)
# print(s4)

 

result = pd.concat([s1,s2,s3], axis=1,sort=True)

sort는 concat의 옵션

# axis = 1 이므로 colum순으로 정렬되며 곂치는 값이 있다면 아래와 같이 곂쳐진다 
display(result)

c의 중복된걸 잘 보아라

sort가 없을때 / 

1번째 series가 1번째 colum  2번째 series가 2번째 colum

sort가 있다면 오름차순 정렬

 


 

# DataFrame을 연결하려면 어떻게 하나요?

import numpy as np
import pandas as pd

np.random.seed(1)

df1 = pd.DataFrame(np.random.randint(0,9,(3,2)),
                  index=['a','b','c'],
                  columns=['one','two'])

# display(df1)

df2 = pd.DataFrame(np.random.randint(0,9,(2,2)),
                  index=['a','b'],
                  columns=['three','four'])

display(df1)
display(df2)


# result = pd.concat([df1,df2],
#                    axis=1)

# display(result)


result = pd.concat([df1,df2],
                   axis=0)

display(result)

 


# 특정값을 처리하기 위한 방법 (이상치와 결치를 처리해보아요!)
# 몇가지 함수에 대해서 알아보아요!

 

결측치(missing value)

 

 


import numpy as np
import pandas as pd

np.random.seed(1)

df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ['A', 'B', 'C', 'D']
# df.index = pd.date_range('20210801', periods=6)
df.index = pd.date_range('20210801', '20210806')

# 새로운 column을 추가해 보아요!
# np.nan => NaN으로 표현되는데 이게 실수로 간주되요!
df['E'] = [7, np.nan, 4, np.nan, 2, np.nan]

display(df)

 



# NaN는 missing value(결치, 결치값)를 처리해야 해요!
# 가장 간단한 방법은 NaN이 포함되어 있는 행을 삭제할 수 있어요!
# 상대적으로 데이터량이 많고(100만개) NaN이 비율적으로 적을때는 가장 좋은 방법 

 

# nan을 지울때
# df2 = df.dropna(how='any', inplace=False)
# how=any인 경우는 NaN이 단 하나라도 포함되어 있으면 해당 행을 지워요!

# how=all인 경우는 해당 행의 모든 column이 NaN인 경우 해당 행을 지워요!

# inplace = true면 원본을 바꾸고 False면은 복사본을 만든다

# display(df2)

# nan을 채울때  -   NaN을 지우기가 부담스러운경우가 있어요! => 데이터의 개수가 작을때
df2 = df.fillna(value=0)

# value = nan 대신에 안에 들어가는 값
# display(df2)

# E column의 값이 NaN것을 찾아 A, B column의 값을 출력하세요!
NaN에 대해서 '==' 연산을 수행할 수 있나요?  이 연산이 수행되지 않아요!
# 그래서 NaN을 찾아내기 위해(판별하기위해) isnull()

isnull은 boolean mask이다



df.loc[df.isnull()['E'], ['A','B']]

# df.isnull()['E'], 까지는 행이고

#  ['A','B']]  까지는 열 (fancy indexing)

 


중복행(duplicated)

 

 

import numpy as np
import pandas as pd

df = pd.DataFrame({'k1' : ['one'] * 3 + ['two'] * 4,
                   'k2' : [1,1,2,3,3,4,4]})

display(df)

 


# 중복행.duplicated)을 어떻게 처리할 수 있나요?   

# 행단위로 중복을 알려준다
 
df.duplicated()  

boolean으로 나온다


# 중복된 행만 추출해 보아요!
# df.loc[df.duplicated(),:]

 


중복된 행을 삭제해보아요!
# df2 = df.drop_duplicates()
# display(df2)

k1, k2, k3 모두가 중복되면 삭제


df['k3'] = range(7)

display(df)


# display(df.drop_duplicates())   # 중복되는 행이 없어요!
# display(df.drop_duplicates(['k1']))

k1의 기준으로 중복 삭제


display(df.drop_duplicates(['k1','k2']))

k1과 k2의 중복만 삭제

 


이상값( replace )

극단치 : 상식적으로 말도 안되게 큰값

 

특정값을 지정한 값으로 변환하려면 어떻게 해야 하나요?
# replace()

import numpy as np
import pandas as pd

s = pd.Series([97, 50, 78, 89, 45, -20, 80])

# 영어성적이라고 간주하면
# 이상한 값이 하나 들어가 있어요!(-20)

new_s = s.replace(-20, 100)

# -20을 100으로 변경하여라
print(new_s)

 


 

'python > pandas, numpy' 카테고리의 다른 글

pandas Grouping  (0) 2021.08.23
pandas merge (feat. join)  (0) 2021.08.23
pandas 공분산, 정렬  (0) 2021.08.21
pandas 인덱스 와 컬럼(index & colum)  (0) 2021.08.20
dataframe으로 json이용  (0) 2021.08.19