본문 바로가기
IT,SW,Data,Cloud,코딩/Python

2023년6월6일 판다스공부

by 착실하게 2023. 6. 6.
반응형

판다스 조건문 

# 연습위해 1회 실행하면 된다. 
# data = {
#     "메뉴":['아메리카노','카페라떼','카페모카', '바닐라라떼', '녹차', '초코라떼', '바닐라콜드브루'],
#     "가격":[4100, 4600, 4600, 5100, 4100, 5000, 5100],
#     "할인율":[0.5, 0.1, 0.2, 0.3, 0, 0, 0],
#     "칼로리":[10, 180, 420, 320, 20, 500, 400],
#     "원두":['콜롬비아', np.NaN, '과테말라', np.NaN, '한국', '콜롬비아', np.NaN],
#     "이벤트가":[1900, 2300, np.NaN, 2600, np.NaN, 3000, 3200],
# }
# data = pd.DataFrame(data)
# data.to_csv('data.csv', index=False)

df = pd.read_csv('data.csv')
print(df)

# 조건 필터. 1개 조건 
# 할인율>0.2
print(df['할인율'] > 0.2)
# 이렇게 하면 조건에 T/F 인지가 출력된다
print(df[df['할인율'] > 0.2])
# condition을 넣어서 뽑으면 해당하는 데이터행이 출력된다

#2개 이상 조건
cond1 = df['할인율'] > 0.2 
cond2 = df['칼로리'] <= 400 
print(df[cond1 & cond2])

#2개 이상 조건
cond1 = df['할인율'] > 0.2 
cond2 = df['칼로리'] <= 400 
print(df[cond1 | cond2])

# 문자열 1개 조건 
# 원두 == 콜롬비아 
cond = df['원두'] == '콜롬비아'
print(df[cond])

cond1 = df['원두'] == '콜롬비아'
cond2 = df['가격'] < 4500 
print(df[cond1 & cond2])

print(df.isnull())
print(df.isnull().sum())

#fillna
df['원두'] = df['원두'].fillna('코스타리카')
print(df)

df['이벤트가'] = df['이벤트가'].fillna(1900)
print(df)

#문자변경 #방법1
# df = df.replace('아메리카노','룽고').replace('녹차','그린티')
# print(df)

#문자변경 #방법2 #딕셔너리
# d = {'아메리카노':'룽고','녹차':'그린티'}
# df = df.replace(d)
df = df.replace({'아메리카노':'룽고','녹차':'그린티',1900:1500})
print(df)
#하려는걸 일단 해서 출력해보고, 원하는 값이 맞으면 대입하는 식으로 하신다고함
#값변경은 딕셔너리 스타일이 제일 편한듯함

#loc로 변경
print(df.loc[3,"원두"] ) #코스타리카 
df.loc[3,"원두"] = "과테말라"
print(df.loc[3,"원두"] ) #과테말라 
# loc는 대입하지 않아도 변경이 되는군

df.loc[:,'이벤트가'] = 1000
print(df)

 

 

 

import pandas as pd 
import numpy as np

df = pd.read_csv('data.csv')
print(df)

#내장함수 살펴보기 

#count (컬럼별 개수 카운트. 기본값: axis =0 )
print(df.count())
#결측값nan은 카운트에서 제외된다. 

#행 기준으로 개수 카운트 하려면 axis=1로 해주면된다. 
# print(df.count(axis=1))

print(len(df))
print(df.shape) #(행,열)

#최대값,최소값,평균,중앙값,합계 
print(
  df['가격'].max(),
  df['가격'].min(),
  df['가격'].mean(),
  round(df['가격'].mean(),2),
  df['가격'].median(),
  int(df['가격'].median()),
  df['가격'].sum(),
  #표준편차 (2회 실기 기출) : std()
  df['가격'].std(),
  #분산
  df['가격'].var(),
  #왜도 skewness
  df['가격'].skew(),
  #첨도 kurtosis 
  df['가격'].kurt(),
  sep='\n'
  #print문의 sep와 end 
)

# DataFrame에 count,mean,std,min,25%,50%,75%
print(df.describe())
print(df['가격'].describe())

#하위 25% 값 
print(df['가격'].quantile(.25))
print(df['가격'].quantile(0.25))
#.25나 0.25나 똑같은 결과나옴.

#상위 25%값
print(df['가격'].quantile(0.75))

#하위 25% 데이터 
print(df[df['가격']< df['가격'].quantile(0.25) ])

#상위 25% 데이터
print(df[df['가격'].quantile(0.75)<df['가격']])

# 원두 컬럼으로 최빈값 구하기 
print(df['원두'].mode())
#Series형태로 출력된다. 그래서 인덱스값, 값으로 나온다. 
print(df['원두'].mode()[0])
#그래서 딱 답만 내려면 [0] 으로 출력해야 한다. 

#apply함수
def cal(x):
  if x>= 300:
    return "No"
  else:
    return "Yes"

print(df)

# apply함수도 대입해야 적용이 된다. 
# df = df['칼로리'].apply(cal)
# 이렇게 하면 적용 안된다. 
# df['칼로리'] = df['칼로리'].apply(cal)
# 이렇게 해야 적용 된다. 


df['먹어도될까요'] = df['칼로리'].apply(cal)
print(df)

#이렇게 함수적용해서 새로운컬럼 생성하는것은 
#Feature Engineering에서 많이 사용된다.

#그러면 컬럼2개에 함수적용해서 새로운 컬럼생성하는방법?
# apply 함수에는 그냥 인자 하나로 넘겨주고 그 안에서 [0], [1] 로 꺼내서 써야함

def cal2(x):
  if x[0] == 4600 and x[1] == 'Yes' : 
    return '아메리 좋아요'
  elif x[0] == 4600: 
    return '야호'
    
#apply대상에 집어넣는걸 넣으면됨
# df['새로운컬럼'] = df[['가격', '먹어도될까요']].apply(cal2,axis=0) 
#이렇게 하니까 NaN만 잔뜩 들어갔음 #원하는 것이 아님 
# print(df)

df['새로운컬럼'] = df[['가격', '먹어도될까요']].apply(cal2,axis=1)
print(df)

# axis: 작용방향. 
# 행방향/세로방향:책을 위로 쌓아 정리하는 것
# 열방향/가로방향:책을 옆으로 꽂아 정리하는것

# axis = 0 (x,y,z)
# 1차원 에서는 열 (열)
# 2차원 에서는 행 (행,열)
# 3차원 에서는 깊이 (깊이,행,열)

#그래서 여기서 axis=1로 해야 원하는 작용이 일어났음 

print("====================")

#원두별 평균 
print(df.groupby('원두').mean(numeric_only=True))

#원두별, 할인율별 평균
print(df.groupby(['원두','할인율']).mean(numeric_only=True))

#원두별, 할인율별, 가격의 평균
print(df.groupby(['원두','할인율'])['가격'].mean(numeric_only=True))

# 이렇게 컬럼 하나 선택해서 평균을 구하면 리턴타입이 Series가 된다. 
# 이러한 Series를 DataFrame으로 바꾸어주려면? pd.DataFrame안에 넣어주면됨. 
print(
pd.DataFrame(df.groupby(['원두','할인율'])['가격'].mean(numeric_only=True)))

# 이렇게 얻은 결과값 데이터프레임은 멀티인덱스임. 여기에 loc, iloc를 사용하려면 불편한 점이 있음. #그래서 reset_index해줘야함 #그러면 예쁘게 바뀜

print(df.groupby(['원두','할인율']).mean(numeric_only=True).reset_index())

 

import pandas as pd
import numpy as np 

data = pd.read_csv('data.csv')
df = pd.DataFrame(data)
print(df)

# 이벤트가 컬럼 결측치는 이벤트가격 데이터 중 최소값으로 결측치 채움 
df['이벤트가']=df['이벤트가'].fillna(df['이벤트가'].min())
print(df)

# '원두' 컬럼 결측치는 원두 데이터 중 최빈값으로 결측치 채움
df['원두']=df['원두'].fillna(df['원두'].mode()[0])
print(df)

#가격이 5000이상인 데이터의 수
print(len(df[5000<=df['가격']]))

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글