사용 데이터¶
dataframe 생성¶
import pandas as pd
df = pd.DataFrame({"carat": [1],
"depth": [60],
"table": [55]})
df
carat | depth | table | |
---|---|---|---|
0 | 1 | 60 | 55 |
dataframe 형태 변환¶
df.transpose()
0 | |
---|---|
carat | 1 |
depth | 60 |
table | 55 |
df.T # T , transpose() 동일한 효과
0 | |
---|---|
carat | 1 |
depth | 60 |
table | 55 |
dataframe 표본 추출¶
df.sample(frac = 0.005, random_state = 34)
carat | depth | table |
---|
dataframe 항목 선택¶
import pandas as pd
df = pd.read_csv("Iris.csv")
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
df.iloc[1,0] # 가장 기본 상수로 선택 index,column
4.9
df.iloc[1,0:2] # 범위로 선택 가능 Series
SepalLengthCm 4.9 SepalWidthCm 3.0 Name: 1, dtype: object
df.iloc[0:1,0:2] # 범위로 선택 가능,양쪽 모두 범위가 되면 dataframe
SepalLengthCm | SepalWidthCm | |
---|---|---|
0 | 5.1 | 3.5 |
df.loc[0:1,"SepalLengthCm":"PetalLengthCm"] # loc는 이름으로 선택
SepalLengthCm | SepalWidthCm | PetalLengthCm | |
---|---|---|---|
0 | 5.1 | 3.5 | 1.4 |
1 | 4.9 | 3.0 | 1.4 |
df.loc[[0,2,4],"SepalLengthCm":"PetalLengthCm"] # 리스트 형태도 가능
SepalLengthCm | SepalWidthCm | PetalLengthCm | |
---|---|---|---|
0 | 5.1 | 3.5 | 1.4 |
2 | 4.7 | 3.2 | 1.3 |
4 | 5.0 | 3.6 | 1.4 |
df.loc[0:1,["SepalLengthCm","PetalLengthCm"]] # 리스트 형태도 가능
SepalLengthCm | PetalLengthCm | |
---|---|---|
0 | 5.1 | 1.4 |
1 | 4.9 | 1.4 |
df.loc[0:1] # 두번째 인자를 생략가능 하다, 이건 인덱스 번호이기 때문
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
df.iloc[0:1] # 두번째 인자를 생략가능 하다, 인덱스 숫자이기 때문 0만 나옴
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
필터, 원하는 데이터만 선택한다¶
llist=([True])*(len(df)//2)
llist=llist + ([False])*(len(df)//2)
print(llist)
df.loc[llist,"SepalLengthCm":"PetalLengthCm"]
# Bool type의 경우 선택하는 역할을 한다, 갯수가 맞아야함
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
SepalLengthCm | SepalWidthCm | PetalLengthCm | |
---|---|---|---|
0 | 5.1 | 3.5 | 1.4 |
1 | 4.9 | 3.0 | 1.4 |
2 | 4.7 | 3.2 | 1.3 |
3 | 4.6 | 3.1 | 1.5 |
4 | 5.0 | 3.6 | 1.4 |
... | ... | ... | ... |
70 | 5.9 | 3.2 | 4.8 |
71 | 6.1 | 2.8 | 4.0 |
72 | 6.3 | 2.5 | 4.9 |
73 | 6.1 | 2.8 | 4.7 |
74 | 6.4 | 2.9 | 4.3 |
75 rows × 3 columns
df["SepalLengthCm"] # 기본은 컬럼을 선택하는 형태
0 5.1 1 4.9 2 4.7 3 4.6 4 5.0 ... 145 6.7 146 6.3 147 6.5 148 6.2 149 5.9 Name: SepalLengthCm, Length: 150, dtype: float64
df["SepalLengthCm"]>6
# 조건이 들어가면 True/False 형태로 저장됨
0 False 1 False 2 False 3 False 4 False ... 145 True 146 True 147 True 148 True 149 False Name: SepalLengthCm, Length: 150, dtype: bool
df.loc[df["SepalLengthCm"]>6,:]
# 조건에 맞는 항목들만 출력 가능하다
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
50 | 7.0 | 3.2 | 4.7 | 1.4 | Iris-versicolor |
51 | 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
52 | 6.9 | 3.1 | 4.9 | 1.5 | Iris-versicolor |
54 | 6.5 | 2.8 | 4.6 | 1.5 | Iris-versicolor |
56 | 6.3 | 3.3 | 4.7 | 1.6 | Iris-versicolor |
... | ... | ... | ... | ... | ... |
144 | 6.7 | 3.3 | 5.7 | 2.5 | Iris-virginica |
145 | 6.7 | 3.0 | 5.2 | 2.3 | Iris-virginica |
146 | 6.3 | 2.5 | 5.0 | 1.9 | Iris-virginica |
147 | 6.5 | 3.0 | 5.2 | 2.0 | Iris-virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
61 rows × 5 columns
df[df["SepalLengthCm"]>6]
# 위와 동일한 표현
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
50 | 7.0 | 3.2 | 4.7 | 1.4 | Iris-versicolor |
51 | 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
52 | 6.9 | 3.1 | 4.9 | 1.5 | Iris-versicolor |
54 | 6.5 | 2.8 | 4.6 | 1.5 | Iris-versicolor |
56 | 6.3 | 3.3 | 4.7 | 1.6 | Iris-versicolor |
... | ... | ... | ... | ... | ... |
144 | 6.7 | 3.3 | 5.7 | 2.5 | Iris-virginica |
145 | 6.7 | 3.0 | 5.2 | 2.3 | Iris-virginica |
146 | 6.3 | 2.5 | 5.0 | 1.9 | Iris-virginica |
147 | 6.5 | 3.0 | 5.2 | 2.0 | Iris-virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
61 rows × 5 columns
복잡한 조건¶
df[(df["SepalLengthCm"]>6.3) & (df["SepalLengthCm"]<6.5)]
# &,| 표현 가능
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
51 | 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
74 | 6.4 | 2.9 | 4.3 | 1.3 | Iris-versicolor |
111 | 6.4 | 2.7 | 5.3 | 1.9 | Iris-virginica |
115 | 6.4 | 3.2 | 5.3 | 2.3 | Iris-virginica |
128 | 6.4 | 2.8 | 5.6 | 2.1 | Iris-virginica |
132 | 6.4 | 2.8 | 5.6 | 2.2 | Iris-virginica |
137 | 6.4 | 3.1 | 5.5 | 1.8 | Iris-virginica |
# nunique
df["Species"].unique()
array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
df["Species"].nunique()
3
df["Species"].value_counts()
Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 Name: Species, dtype: int64
df["Species"].count()
150
df.groupby("Species").size()
Species Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 dtype: int64
그룹¶
import pandas as pd
df = pd.read_csv("Iris.csv")
pd.crosstab(df["Species"],df["SepalWidthCm"])
# value의 카운트 값 groupby로 대체 할 수 있음
# 각각에 대해서 횟수가 몇번 나오는지
SepalWidthCm | 2.0 | 2.2 | 2.3 | 2.4 | 2.5 | 2.6 | 2.7 | 2.8 | 2.9 | 3.0 | ... | 3.4 | 3.5 | 3.6 | 3.7 | 3.8 | 3.9 | 4.0 | 4.1 | 4.2 | 4.4 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Species | |||||||||||||||||||||
Iris-setosa | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 6 | ... | 9 | 6 | 2 | 3 | 4 | 2 | 1 | 1 | 1 | 1 |
Iris-versicolor | 1 | 2 | 3 | 3 | 4 | 3 | 5 | 6 | 7 | 8 | ... | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Iris-virginica | 0 | 1 | 0 | 0 | 4 | 2 | 4 | 8 | 2 | 12 | ... | 2 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 0 |
3 rows × 23 columns
df.groupby("Species")["SepalWidthCm"].value_counts()
# pd.crosstab 과 동일한 결과를 구할 수 있음
Species SepalWidthCm Iris-setosa 3.4 9 3.0 6 3.5 6 3.1 5 3.2 5 3.8 4 3.7 3 3.3 2 3.6 2 3.9 2 2.3 1 2.9 1 4.0 1 4.1 1 4.2 1 4.4 1 Iris-versicolor 3.0 8 2.9 7 2.8 6 2.7 5 2.5 4 2.3 3 2.4 3 2.6 3 3.1 3 3.2 3 2.2 2 2.0 1 3.3 1 3.4 1 Iris-virginica 3.0 12 2.8 8 3.2 5 2.5 4 2.7 4 3.1 4 3.3 3 2.6 2 2.9 2 3.4 2 3.8 2 2.2 1 3.6 1 Name: SepalWidthCm, dtype: int64
df.groupby("Species")["SepalWidthCm"].value_counts().unstack()
# unstack 사용
SepalWidthCm | 2.0 | 2.2 | 2.3 | 2.4 | 2.5 | 2.6 | 2.7 | 2.8 | 2.9 | 3.0 | ... | 3.4 | 3.5 | 3.6 | 3.7 | 3.8 | 3.9 | 4.0 | 4.1 | 4.2 | 4.4 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Species | |||||||||||||||||||||
Iris-setosa | NaN | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | 1.0 | 6.0 | ... | 9.0 | 6.0 | 2.0 | 3.0 | 4.0 | 2.0 | 1.0 | 1.0 | 1.0 | 1.0 |
Iris-versicolor | 1.0 | 2.0 | 3.0 | 3.0 | 4.0 | 3.0 | 5.0 | 6.0 | 7.0 | 8.0 | ... | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Iris-virginica | NaN | 1.0 | NaN | NaN | 4.0 | 2.0 | 4.0 | 8.0 | 2.0 | 12.0 | ... | 2.0 | NaN | 1.0 | NaN | 2.0 | NaN | NaN | NaN | NaN | NaN |
3 rows × 23 columns
df.groupby("Species")["SepalWidthCm"].value_counts().unstack().melt()
# unstack, melt 의 미묘한 관계
SepalWidthCm | value | |
---|---|---|
0 | 2.0 | NaN |
1 | 2.0 | 1.0 |
2 | 2.0 | NaN |
3 | 2.2 | NaN |
4 | 2.2 | 2.0 |
... | ... | ... |
64 | 4.2 | NaN |
65 | 4.2 | NaN |
66 | 4.4 | 1.0 |
67 | 4.4 | NaN |
68 | 4.4 | NaN |
69 rows × 2 columns
df.groupby("Species")["SepalWidthCm"].value_counts().unstack().melt().unstack()
SepalWidthCm 0 2.0 1 2.0 2 2.0 3 2.2 4 2.2 ... value 64 NaN 65 NaN 66 1.0 67 NaN 68 NaN Length: 138, dtype: float64
정렬¶
import pandas as pd
df = pd.read_csv("Iris.csv")
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
df.sort_values("SepalLengthCm").head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
13 | 4.3 | 3.0 | 1.1 | 0.1 | Iris-setosa |
42 | 4.4 | 3.2 | 1.3 | 0.2 | Iris-setosa |
dataframe의 type변경 : astype()¶
import pandas as pd
df = pd.read_csv("Iris.csv")
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
df["SepalLengthCm"] = df["SepalLengthCm"].astype("int32")
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |
---|---|---|---|---|---|
0 | 5 | 3.5 | 1.4 | 0.2 | Iris-setosa |
1 | 4 | 3.0 | 1.4 | 0.2 | Iris-setosa |
dataframe의 정렬 / 최대 최소¶
df.sort_values(by="SepalLengthCm").iloc[0] # 제일 작은 항목
SepalLengthCm 4 SepalWidthCm 3.0 PetalLengthCm 1.4 PetalWidthCm 0.3 Species Iris-setosa Name: 45, dtype: object
df.SepalLengthCm.min()
4
df.SepalLengthCm.idxmin()
1
df.SepalLengthCm.idxmax()
50
df.SepalLengthCm.max()
7
dataframe apply , 축으로 함수 실행¶
import pandas as pd
df = pd.read_csv("Iris.csv")
df = df.drop("Species",axis=1)
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
df.sum()
SepalLengthCm 876.5 SepalWidthCm 458.1 PetalLengthCm 563.8 PetalWidthCm 179.8 dtype: float64
def sum_c(XX):
return XX.sum()
df.apply(sum_c) # 기본적으로 세로방향 column 단위
SepalLengthCm 876.5 SepalWidthCm 458.1 PetalLengthCm 563.8 PetalWidthCm 179.8 dtype: float64
a = 0
def sum_c(XX):
global a
a = a + 1
return XX.sum()
df.apply(sum_c)
print(a) # 4 번 호출된다.
4
def sum_c(XX):
return XX.sum()
df.apply(sum_c,axis=1) # 가로 방향 row 단위
0 10.2 1 9.5 2 9.4 3 9.4 4 10.2 ... 145 17.2 146 15.7 147 16.7 148 17.3 149 15.8 Length: 150, dtype: float64
def test(XX):
if XX>5 :
return "1"
else:
return "0"
# 값을 어떤 조건에 맞게 자유 자재로 변경이 가능하다
# df["SepalLengthCm"] 이 부분은 Serial 이기 때문에 axis가 필요하지 않다
df["SepalLengthCm"].apply(test)
0 1 1 0 2 0 3 0 4 0 .. 145 1 146 1 147 1 148 1 149 1 Name: SepalLengthCm, Length: 150, dtype: object
df["SepalLengthCm"]=df["SepalLengthCm"].apply(test)
df.head()
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 1 | 3.5 | 1.4 | 0.2 |
1 | 0 | 3.0 | 1.4 | 0.2 |
2 | 0 | 3.2 | 1.3 | 0.2 |
3 | 0 | 3.1 | 1.5 | 0.2 |
4 | 0 | 3.6 | 1.4 | 0.2 |
합치기¶
import pandas as pd
df = pd.read_csv("Iris.csv")
df = df.drop("Species",axis=1)
df.head(2)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
df2=df.head(10)
df2
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
5 | 5.4 | 3.9 | 1.7 | 0.4 |
6 | 4.6 | 3.4 | 1.4 | 0.3 |
7 | 5.0 | 3.4 | 1.5 | 0.2 |
8 | 4.4 | 2.9 | 1.4 | 0.2 |
9 | 4.9 | 3.1 | 1.5 | 0.1 |
len(df2)
10
df3=df.head(3)
len(df3)
3
# 위 아래로 붙이기 axis=0 index
pd.concat([df2,df3],axis=0)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
5 | 5.4 | 3.9 | 1.7 | 0.4 |
6 | 4.6 | 3.4 | 1.4 | 0.3 |
7 | 5.0 | 3.4 | 1.5 | 0.2 |
8 | 4.4 | 2.9 | 1.4 | 0.2 |
9 | 4.9 | 3.1 | 1.5 | 0.1 |
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
# 합쳐서 인덱스가 이상해지는 경우 인덱스 초기화를 해준다
# 이전 인덱스가 필요없다면 drop=True
pd.concat([df2,df3],axis=0).reset_index(drop=True)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
5 | 5.4 | 3.9 | 1.7 | 0.4 |
6 | 4.6 | 3.4 | 1.4 | 0.3 |
7 | 5.0 | 3.4 | 1.5 | 0.2 |
8 | 4.4 | 2.9 | 1.4 | 0.2 |
9 | 4.9 | 3.1 | 1.5 | 0.1 |
10 | 5.1 | 3.5 | 1.4 | 0.2 |
11 | 4.9 | 3.0 | 1.4 | 0.2 |
12 | 4.7 | 3.2 | 1.3 | 0.2 |
# 좌우로 붙이기 axis=1
pd.concat([df2,df3],axis=1)
SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |
---|---|---|---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | NaN | NaN | NaN | NaN |
4 | 5.0 | 3.6 | 1.4 | 0.2 | NaN | NaN | NaN | NaN |
5 | 5.4 | 3.9 | 1.7 | 0.4 | NaN | NaN | NaN | NaN |
6 | 4.6 | 3.4 | 1.4 | 0.3 | NaN | NaN | NaN | NaN |
7 | 5.0 | 3.4 | 1.5 | 0.2 | NaN | NaN | NaN | NaN |
8 | 4.4 | 2.9 | 1.4 | 0.2 | NaN | NaN | NaN | NaN |
9 | 4.9 | 3.1 | 1.5 | 0.1 | NaN | NaN | NaN | NaN |
# 좌우로 붙이는 경우 컬럼명이 중복되는 현상이 나올 수 있음
# 길이가 다른 경우 결측치가 나온다