PYTHON/데이터분석

통계분석시각화-pandas

sshhhh 2023. 9. 15.

Numpy는 같은 데이터 타입의 배열만 처리 할 수 있다.

pandas는 데이터 타입이 다양하게 섞여있을때도 처리할 수 있다.

 

 

#Series

pandas에서 데이터를 생성하는 가장 기본적인 방법 - 1차원 데이터 생성
Series 형식의 구조적 데이터를 생성할 수 있다.
ex) s=pd.Series(시퀸스 데이터)  튜플,리스트 리스트를 주로 사용 
 
s = pd.Series([1,2,3,4,5]) 
print(s)

"""
인덱스/데이터(values)
0      1
1      2
2      3
3      4
4      5
dtype: int64
""

 

print(s.values)
#[1 2 3 4 5]

 

s=pd.Series(["홍길동", "나길동", "선우길동"])
print(s)

"""
0     홍길동
1     나길동
2    선우길동
dtype: object
"""

 

subjects=["국어", "영어", "수학"]
s=pd.Series([90,85,80], index=subjects)
print(s)

"""
국어    90
영어    85
수학    80
dtype: int64

"""

 

nan은 데이터가 없다는 것 데이터를 위한 인덱스 자리는 있지만 실제 값은 없다
import numpy as np
s1 = pd.Series([np.nan,10,30]) 
s2 = pd.Series([None,10,30]) #둘다 데이터값 없다.
s3 = pd.Series([0,10,30])
s4 = pd.Series([-1,10,30])
print(s1)
print(s2)
print(s3)
print(s4)

"""
0     NaN
1    10.0
2    30.0
dtype: float64
0     NaN
1    10.0
2    30.0
dtype: float64
0     0
1    10
2    30
dtype: int64
0    -1
1    10
2    30
dtype: int64

"""

 

#값 비교

print(np.nan==np.nan) #값이 다르다.
print(None == None) 
print(np.nan is np.nan) #참조는 같다
print(None is None)

"""
False
True
True
True
"""

 

 

 

#날짜 시퀀스

pd.data_range(start= ,end= ,periods= , freq='D)  -- 시작, 끝, 날짜 데이터 생성기간, 생성 주기(D=하루씩 증가)

s= pd.date_range(start='2019-01-01',end='2022-02-28')
print(s)


"""
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07', '2019-01-08',
               '2019-01-09', '2019-01-10',
               ...
               '2022-02-19', '2022-02-20', '2022-02-21', '2022-02-22',
               '2022-02-23', '2022-02-24', '2022-02-25', '2022-02-26',
               '2022-02-27', '2022-02-28'],
              dtype='datetime64[ns]', length=1155, freq='D')

"""

 

#DataFrame

data를 담는 틀 -> 라벨이 있는 2차원 데이터를 생성하고 처리할 수 있다.

<형식>

df = pd.DataFrame(data [ , index =index_data , columns = columns_Data])

data에는 리스트와 형태가 유사한 데이터 타입은 모두 사용할 수 있다. matrix형태이다.

->리스트,딕셔너리 타입의 데이터, numpy의 배열 데이터 ,Series,DataFrame

세로축 : index

가로축 : colums

제외한 부분 : values

index1 / colums1 coulms2 coulms3
index2 values1 values2

 

 

df = pd.DataFrame([["길동이",90,80,70],["부길동",80,70,60]])
print(df)

"""
     0   1   2   3
0  길동이  90  80  70
1  부길동  80  70  60

"""

print(df.index) #RangeIndex(start=0, stop=2, step=1)

print(df.columns) #RangeIndex(start=0, stop=4, step=1)

print(df.values) 
"""
[['길동이' 90 80 70]
 ['부길동' 80 70 60]]
 """

 

index와 columns 지정 가능

nums=[1,2]
cnames=["이름","국어","수학","영어"]
df = pd.DataFrame([["길동이",90,80,70],["부길동",80,70,60]] , index =nums ,columns=cnames)
print(df)


"""
    이름  국어  수학  영어
1  길동이  90  80  70
2  부길동  80  70  60

"""

 

딕셔너리 타입의 데이터 

table_data ={"연도" : [2020,2021,2022]
             ,"매출": [200,100,120]}
df = pd.DataFrame(table_data)
print(df)

"""
     연도   매출
0  2020  200
1  2021  100
2  2022  120
"""

 

데이터에 대한 전반적인 정보

df를 구성하는 행,열의 크기, 컬럼명, 컬럼값 자료형

print(df.info())

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   연도      3 non-null      int64
 1   매출      3 non-null      int64
dtypes: int64(2)
memory usage: 176.0 bytes
None

"""

 

통계량 요약

print(df.describe())

"""
           연도          매출
count     3.0    3.000000           총데이터수
mean   2021.0  140.000000           평균
std       1.0   52.915026           표준편차
min    2020.0  100.000000           최소값
25%    2020.5  110.000000           백분위 
50%    2021.0  120.000000
75%    2021.5  160.000000
max    2022.0  200.000000           최대값

"""

 

 

#dataframe 데이터 연산

Series()와 DataFrame()으로 생성한 데이터는 사칙연산을 할 수 있다.

 

s1 = pd.Series([1,2,3,4,5])
s2 = pd.Series([6,7,8,9,10])
s3 = s1+s2
print(s1)
print(s2)
print(s3)

"""
0    1
1    2
2    3
3    4
4    5
dtype: int64
0     6
1     7
2     8
3     9
4    10
dtype: int64
0     7
1     9
2    11
3    13
4    15
dtype: int64
"""

 

 

#연산 More
s1 =pd.Series([1,2,3,4], index=['a','b','c','d'])
s2 =pd.Series([5,8,7,5], index=['a','b','c','d'])
s3 =s1+s2
print(s3)

"""
a     6
b    10
c    10
d     9
dtype: int64
"""

 

data1 = {"홍길동":[80,70,78],
        "야길동":[78,41,52],
        "김길동":[66,22,55]
        }
df1 =pd.DataFrame(data1)

data2 = {"홍길동":[77,88,99],
        "야길동":[11,22,33],
        "김길동":[44,55,66]
        }
df2 =pd.DataFrame(data2)

print(df1)
print(df2)

"""
  홍길동  야길동  김길동
0   80   78   66
1   70   41   22
2   78   52   55
   홍길동  야길동  김길동
0   77   11   44
1   88   22   55
2   99   33   66

"""
df3=df1+df2
print(df3)

"""
홍길동  야길동  김길동
0  157   89  110
1  158   63   77
2  177   85  121

"""

 

df3.describe()

출력창

 

 

<함수가 DataFrame에 적용되는 방향 지정>

axis = 1 : DataFrame에서 행 단위로 적용됨

axis = 0 : 열 단위

print(df3.mean())
print(df3.mean(axis=1))

"""
print(df3.mean())
print(df3.mean(axis=1))
홍길동    164.000000
야길동     79.000000
김길동    102.666667
dtype: float64
0    118.666667
1     99.333333
2    127.666667
dtype: float64
"""
df3

 

 

head() , tail() : 처음 / 마지막 행 반환 

 

 

#CSV파일 읽어오기 

df=pd.read_csv('/content/drive/MyDrive/파이썬/iris.csv')
print(df)


"""
  sepal.length  sepal.width  petal.length  petal.width    variety
0             5.1          3.5           1.4          0.2     Setosa
1             4.9          3.0           1.4          0.2     Setosa
2             4.7          3.2           1.3          0.2     Setosa
3             4.6          3.1           1.5          0.2     Setosa
4             5.0          3.6           1.4          0.2     Setosa
..            ...          ...           ...          ...        ...
145           6.7          3.0           5.2          2.3  Virginica
146           6.3          2.5           5.0          1.9  Virginica
147           6.5          3.0           5.2          2.0  Virginica
148           6.2          3.4           5.4          2.3  Virginica
149           5.9          3.0           5.1          1.8  Virginica

[150 rows x 5 columns]

"""
df.loc[50] #조건 필터

"""
sepal.length           7.0
sepal.width            3.2
petal.length           4.7
petal.width            1.4
variety         Versicolor
Name: 50, dtype: object

"""

 

 

#데이터 통합하기

이렇게하면 변화가 없다.

data = {"국어" : [100, 38, 45, 89],
       "영어" : [90, 80, 75, 70]}
df1 = pd.DataFrame(data)
print(df1)

"""
    국어  영어
0  100  90
1   38  80
2   45  75
3   89  70
"""

data2 = {"국어" : [70, 80],
       "영어" : [75, 100]}
df2 = pd.DataFrame(data2)
print(df2)

"""
   국어   영어
0  70   75
1  80  100
"""

df1.append(df2)
print(df1)
"""
    국어  영어
0  100  90
1   38  80
2   45  75
3   89  70
"""

 

변수에 넣어서 변화된 객체를 반환할 것.

rdf = df1.append(df2)
print(rdf) #변수에 넣으면 변화ㅇ
print()
print(df1) #df1 변화x

"""
    국어   영어
0  100   90
1   38   80
2   45   75
3   89   70
0   70   75
1   80  100

    국어  영어
0  100  90
1   38  80
2   45  75
3   89  70


"""

 

rdf=df.append(df2, ignore_index=True) #default는 false
print(rdf)

"""
    국어   영어
0  100   90
1   38   80
2   45   75
3   89   70
4   70   75
5   80  100
"""

df3 + df

data3 = {"국어" : [75, 80]}
df3 = pd.DataFrame(data3)
print(df3)

"""
   국어
0  75
1  80
"""

print(df)

"""
    국어  영어
0  100  90
1   38  80
2   45  75
3   89  70
"""

 

rdf

rdf = df.append(df3)
print(rdf)

"""
    국어    영어
0  100  90.0
1   38  80.0
2   45  75.0
3   89  70.0
0   75   NaN
1   80   NaN

"""

 

df4+df

data4 = {"수학" : [90,85,88]}
df4 = pd.DataFrame(data4)
print(df4)

"""
   수학
0  90
1  85
2  88
"""
rdf = df.join(df4)
print(rdf)

"""
 국어  영어    수학
0  100  90  90.0
1   38  80  85.0
2   45  75  88.0
3   89  70   NaN

"""

 

 

 

#결측치표현

Missing feature, NA(Not Available) : 표기되지 않은 값 - >머신러닝중 누락된 값

 

 

value = np.nan
print(value)

#nan

 

value2 = None
print(value2)

#None

 

se1 = pd.Series([남궁길', '선우길', np.nan, '독고길'])
se1.isnull() #결측치 여부 확인

"""
0    False
1    False
2     True
3    False
dtype: bool

"""
#se1.info()
se1[0] = np.nan
print(se1)

"""
0    NaN
1    선우길
2    NaN
3    독고길
dtype: object
"""
se1[1] = None
print(se1)

"""
0     NaN
1    None
2     NaN
3     독고길
dtype: object
"""

non ,none는 빈값

se1.isnull()

"""
0     True
1     True
2     True
3    False
dtype: bool

"""
se1.notnull()

"""
0    False
1    False
2    False
3     True
dtype: bool
"""

 

dropna( ) : NaN 값이 있는 데이터 제거 

#전처리 과정에서 결측 데이터 제외하기
se2=se1.dropna()
print(se2)

"""
3    독고길
dtype: object
"""

 


df1 = pd.DataFrame([[1, np.nan, 3,4], [np.nan,np.nan,np.nan,np.nan], [3,4,1,1]])
print(df1)

"""
  0    1    2    3
0  1.0  NaN  3.0  4.0
1  NaN  NaN  NaN  NaN
2  3.0  4.0  1.0  1.0

"""
#하나라도 결측치일 때 해당 Row(index)를 삭제
df2=df1.dropna()
print(df2)

"""
  0    1    2    3
2  3.0  4.0  1.0  1.0
"""
모든 컬럼이 결측치일 때 해당 Row(index)를 삭제
df3 = df1.dropna(how='all')
print(df3)

"""
    0    1    2    3
0  1.0  NaN  3.0  4.0
2  3.0  4.0  1.0  1.0

"""

댓글