본문 바로가기

6.Numpy | Pandas | Crawling

5/19(금) IT K-DT(55일차) / 2-4.DataFrame기본정보~2-11.통계값다루기

 

2. 판다스(Pandas)

2-4. DataFrame 기본정보 알아보기

예제의 코드에서 보이는 'df'는 'DataFrame'을 지칭하는 단어.

예제는 아이돌에 대한 데이터임.

 

2-4-5. 정렬하기

 

df.sort_index()      # index로 오름차순 정렬

 

 

df.sort_index(ascending=False)      # index로 내림차순 정렬

 

 

df.sort_values(by='height')      # 값에 따른 오름차순 정렬

 

 

df.sort_values(by='height', ascending=False)      # 값에 따른 내림차순 정렬

 


예) NaN을 가장 위로 올리고 싶은 경우. na_position의 기본값은 last(=맨 아래에 위치)

df.sort_values(by='height', na_position='first')

 


# 조건이 동일할 때, 두번째 조건을 설정하고 싶은 경우
1차 정렬: 키(내림차순) + 2차 정렬: 브랜드(오름차순) + NaN 맨 위로 올림

 

df.sort_values(by=[조건1, 조건2], ascending=[정렬조건1, 정렬조건2], NaN)
df.sort_values(by=['height', 'brand'], ascending=[False, True], na_position='first');

 

(파이썬은 코드 내 data가 2개 이상인 경우 list를 사용)

 

2-5. 데이터 다루기

 

df.head()

 

data에서 특정 필드값의 data만 뽑고 싶은 경우

df [ 필드값 ]

print(df['blood']);      # 혈액형만 뽑고 싶은 경우
print(type(df['blood'])) # 해당 데이터 타입은 series

 

 

2-5-1. 범위 선택

 

df.head(3)

 

 

df[:3]

 


loc 인덱싱:

Pandas 라이브러리에서 제공하는 인덱싱 방법.

라벨(label) 기반 인덱싱을 수행하는 방법으로, 행과 열의 라벨을 사용하여 데이터에 접근하고 조작함.
DataFrame에서 loc 인덱싱을 사용하면 특정 행과 열을 선택하거나 조건에 따라 데이터를 필터링할 수 있음.

df.loc [ 인덱스범위 , 가져올필드 ]

df.loc[ : , 'name']      # name만 모두 가져옴.

 


df.loc[2:5, 'name']      # index번호 2부터 '5'까지 모두 포함하여 name을 가져옴

 

 

(일반 slicing과 다르게 끝번호를 포함시킴)

 

df.loc[:,['name', 'gender', 'height']] 

#특정 컬럼(name, gender, height)의 모든 행을 보고 싶은 경우. 여러개는 리스트를 사용.


df.loc[3:8, 'name':'gender'] 

# 3번부터 8번까지의 열을 name부터 gender까지 가져옴


iloc 인덱싱

정수(integer) 기반의 위치 인덱싱을 수행하는 방법.

행과 열의 정수 위치를 사용하여 데이터에 접근하고 조작하는데 사용.

Pandas의 데이터 구조 중 하나인 DataFrame에서 iloc 인덱싱을 사용하면 특정 행과 열을 선택하거나 조건에 따라 데이터를 필터링할 수 있습니다.

df.iloc[:, [0,2]] 


df.iloc[:, 0:2] # index 2번 컬럼을 포함하지 않았음. (중요!)


df.iloc[1:3, 2:4] # row를 1부터 3직전, column을 2부터 4직전까지.

 

loc인덱싱과 iloc인덱싱의 차이


loc 인덱싱과 iloc 인덱싱은 Pandas 라이브러리에서 데이터프레임을 조작하거나 쿼리할 때 사용되는 두 가지 주요 인덱싱 방법.


loc 인덱싱 (Label-based indexing)
행과 열의 레이블을 사용하여 데이터에 접근.
loc[행, 열] 형식으로 사용되며, 행과 열에 대한 레이블을 명시적으로 지정.
인덱스 레이블을 사용하여 데이터를 선택하므로, 정수 인덱스가 아닌 레이블을 사용하는 경우에 유용.
슬라이싱을 할 때, 마지막 인덱스도 포함. (중요)

iloc 인덱싱 (Integer-based indexing):
정수 인덱스를 사용하여 데이터에 접근.
iloc[행, 열] 형식으로 사용되며, 정수 인덱스를 명시적으로 지정.
정수 인덱스를 사용하여 데이터를 선택하므로, 레이블이 아닌 정수 인덱스를 사용하는 경우에 유용.
슬라이싱을 할 때, 마지막 인덱스는 제외.

예)

data = {'Name': ['John', 'Emily', 'Mike'],
            'Age': [25, 30, 35],
            'City': ['New York', 'London', 'Paris']}

df = pd.DataFrame(data)

df.loc[0, 'Name']은 첫 번째 행의 'Name' 열의 값을 선택. ('John')
df.iloc[0, 0]은 첫 번째 행의 첫 번째 열의 값을 선택. ('John')

 

2-6. Boolean Indexing

조건, 비교연산을 넣으면 해당 결과가 T / F로 출력.

특정 자료구조에 넣을 때 true만 뽑을 수 있음.

df['height']>=180 

# height가 180이상인 값을 True를 줌.


df[df['height']>=180]

# height가 180이상인 사람의 데이터는 true이고, true를 뽑아옴.

(df의 밖에 df를 작성하는 방식)


 # height가 180이상인 사람의 이름만 보고싶은 경우
 df['name'][df['height']>=180]

 

or

 

 df[df['height']>=180]['name'] 

 

# 여러 개의 행(name, gender, height)을 뽑아서 보고 싶은 경우
df[['name', 'gender', 'height']][df['height']>=180]


# 위의 내용을 loc로 만들어보기. loc[행의조건, 열의조건]
df.loc[df['height']>=180,['name', 'gender', 'height']]

 

2-7. isin

정의한 list에 있는 데이터를 색인하려는 경우 사용하는 함수.

(조건을 걸어줄 값이 list안에 있을 때 색인하는 방법)
company = ['플레디스', 'SM']

# 위에서 뽑은 company 2개가 df의 company에 있는지를 확인
df['company'].isin(company) 


df[df['company'].isin(company) ] 

# T/F가 아니도록 뽑는 법


df.loc[df['company'].isin(company),: ]

# loc를 이용해서 뽑는 법

 

2-8. 결측값

Null: 비어있는 값, 결측값.
pandas에서 NaN(Not a Number)로 표기된 값은 모두 결측값.

df.info()
# df에서 결측값이 존재하는 필드는 group과 height가 있음. 


df.isna() # 결측값을 t/f로 조회


df.isnull() # isna()와 동일함.


df['group'].isna() # group필드에 대해 결측값이 있는지의 여부를 확인


df[df['group'].isna()] # 위의 결측값이 있는 데이터를 가져오고 싶은 경우


df['name'][df['group'].isna()]     # 데이터 중에서 이름만 가져오고 싶은 경우


df[df['group'].notnull()]       # group중 null값이 아닌 사람만 출력 (강다니엘이 빠져있음)


# 그룹이 있는 연예인의 이름, 키, 혈액형 출력. (loc를 사용)
df.loc[df['group'].notnull(),['name','group','blood']]


# NaN값이 포함된 height값을 출력
df['height']


# fillna(): 결측값을 대체해주는 함수. (굉장히 많이 사용되므로 숙지해두기)
# height의 NaN값을 0으로 대체.
df['height'].fillna(0)


# inplace연산을 이용하여 NaN을 0으로 수정한 부분을 반영.
df['height'].fillna(0, inplace=True)
# 정상적으로 수정이 반영된 것을 확인할 수 있음.


# NaN으로 수정되기전의 df를 다시 가져온 후, df2라는 파일로 복사

df = pd.read_csv('http://bit.ly/ds-ko1rean-idol')
df2 = df.copy()


# 평균값: mean() 사용
height = df2['키'].mean()
height


df2['키'] = df2['키'].fillna(height)
df2['키']


# 존재하는 값 중 50% 위치의 값: median()
height = df2['키'].median()
height


# 결측값이 있는 데이터 행을 삭제
# 결측값이 1개라도 있는 경우에도 행을 삭제
df.dropna()


# 결측값이 있는 데이터 열을 삭제 (흔한 경우는 아님)
df.dropna(axis=1)

 

2-9. 데이터 복사

new_df = df
new_df


new_df['이름']='김사과'
new_df.head()



#16진수 형태(hex)의 메모리 주소를 반환.
print(hex(id(new_df)))
print(hex(id(df)))

copy_df = df.copy()
print(hex(id(copy_df))) #복사했지만 메모리주소가 다름.


copy_df['이름']='반하나'
copy_df.head()


df.head() # copy한 값이므로 df와 cody_df는 다른 값을 보임.

 

2-10. 행, 열 추가 및 삭제

 

2-10-1. 행 추가하기

* dict  형태의 데이터를 만들고, append()함수를 사용하여 데이터를 추가함.
* 반드시 ignore_index=True 옵션을 추가해야 에러가 발생하지 않음.

dic1 = {
    '이름': '김사과',
    '그룹': '애플',
    '소속사': 'apple',
    '성별': '여자',
    '생년월일': '2000-01-01',
    '키': 160,
    '혈액형': 'A',
    '브랜드평판지수': 987654321
}


# df 안에 dic1의 자료를 추가.
df.append(dic1, ignore_index=True) 


df = df.append(dic1, ignore_index=True) # df안에 위의 추가내용을 저장


df

 

2-10-2. 열 추가하기

df['국적'] = '대한민국'
df.tail()


df


#'김사과'의 국적을 '미국'으로 변경 (단, loc를 사용하여 작성)
df.loc[df['이름']=='김사과', '국적'] = '미국'
df

 

2-10-3. 열 제거하기

# 그룹이라는 열을 제거

df.drop('그룹', axis=1) 


df.drop(['그룹', '소속사'], axis=1) # 그룹, 소속사라는 복수의 열을 제거

 

2-10-4. 행 제거하기

df.drop(15, axis=0)


#1, 3, 5, 15를 날리고 싶은 경우
df.drop([1,3,5,15], axis=0)

 

2-11. 통계값 다루기

df.describe()


# 키의 합계
df['키'].sum()


# 키의 갯수. 갯수는 NaN을 빼고 셈.
df['키'].count()


# 키의 평균
df['키'].mean()


#키의 최대값
df['키'].max()


#키의 분산 (데이터가 평균으로부터 얼마나 떨어져있는지의 정도)
# Σ(데이터 - 평균) ** 2 / 데이터의 갯수
df['키'].var()


#키의 표준편차
# sqrt(분산)
df['키'].std()