사용 데이터¶
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 |
# 좌우로 붙이는 경우 컬럼명이 중복되는 현상이 나올 수 있음
# 길이가 다른 경우 결측치가 나온다