from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
import pandas as pd
data_frame = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic_examples/data/friend_list.csv')
data_frame.head()
# 데이터프레임이 가지고 있는 함수의 예제입니다.
data_frame.head()
type(data_frame.job)
# pandas.core.series.Series
# 시리즈의 함수 예제입니다.
data_frame.job = data_frame.job.str.upper()
data_frame.head()
s1 = pd.core.series.Series(['one', 'two', 'three'])
s2 = pd.core.series.Series([1, 2, 3])
pd.DataFrame(data=dict(word=s1, num=s2)
read_csv
함수로 파일을 데이터프레임으로 호출할 수 있습니다.df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic_examples/data/friend_list.csv')
df
df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic_examples/data/friend_list.txt')
df.head()
df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic_examples/data/friend_list_tab.txt', delimiter = "\t")
df.head()
df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic/data/friend_list_no_head.csv', header = None)
df.head()
df.columns = ['name', 'age', 'job']
df.head()
df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic/data/friend_list_no_head.csv', header = None, names=['name', 'age', 'job'])
df.head()
friend_dict_list = [{'name': 'Jone', 'age': 20, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list)
df.head()
df = df[['name', 'age', 'job']]
df.head()
from collections import OrderedDict
friend_ordered_dict = OrderedDict([ ('name', ['John', 'Jenny', 'Nate']),
('age', [20, 30, 30]),
('job', ['student', 'developer', 'teacher']) ] )
df = pd.DataFrame.from_dict(friend_ordered_dict)
df.head()
friend_list = [ ['John', 20, 'student'],['Jenny', 30, 'developer'],['Nate', 30, 'teacher'] ]
column_name = ['name', 'age', 'job']
df = pd.DataFrame.from_records(friend_list, columns=column_name)
df.head()
friend_list = [
['name',['John', 'Jenny', 'Nate']],
['age',[20,30,30]],
['job',['student', 'developer', 'teacher']]
]
df = pd.DataFrame.from_dict(friend_list)
df.head()
friend_list = [
['name',['John', 'Jenny', 'nate']],
['age',[20,30,30]],
['job',['student', 'developer', 'teacher']]
]
df = pd.DataFrame.from_dict(friend_list)
df.head()
df.to_csv('friend_list_from_df.csv')
friend_list = [ ['John', 20, 'student'],['Jenny', 30, 'developer'],['Nate', 30, 'teacher'] ]
df = pd.DataFrame.from_records(friend_list)
df.head()
df.to_csv('friend_list_from_df.csv')
df.to_csv('friend_list_from_df.txt')
df.to_csv('friend_list_from_df.csv', header = True, index = True)
df.to_csv('friend_list_from_df.csv', header = False, index = False)
df.to_csv('friend_list_from_df.csv', header = ['name', 'age', 'job'])
friend_list = [
['name',['John', None, 'nate']],
['age',[20,None,30]],
['job',['student', 'developer', 'teacher']]
]
df = pd.DataFrame.from_dict(friend_list)
df.head()
df.to_csv('friend_list_from_df.csv')
df.to_csv('friend_list_from_df.csv', na_rep = '-')
friend_list = [
['name',['John', 'Jenny', 'Nate']],
['age',[20,30,30]],
['job',['student', 'developer', 'teacher']]
]
# 데이터를 변환하여 적절한 형태로 만듦
data = {'name': friend_list[0][1], 'age': friend_list[1][1], 'job': friend_list[2][1]}
# 데이터프레임 생성
df = pd.DataFrame(data)
#df = pd.DataFrame.from_dict(friend_list)
df.head()
df[1:3]

- 아래는 순차적이지 않은 로우를 선택하는 예제입니다.
```python
df.loc[[0,2]]
df.head()
df['age'] > 25
df_filtered = df[df['age'] > 25]
df_filtered
df_filtered = df.query('age>25')
df_filtered
df_filtered = df[(df.age >25) & (df.name == 'Nate')]
df_filtered
df
friend_list = [ ['John', 20, 'student'],['Jenny', 30, 'developer'],['Nate', 30, 'teacher'] ]
df = pd.DataFrame.from_records(friend_list)
df
모든 로우를 보여주되, 컬럼은 0부터 1까지만 출력하는 예제입니다.
df.iloc[:, 0:2]
모든 로우를 보여주되, 컬럼 0와 2만 출력하는 예제입니다.
df.iloc[:,[0,2]]
df
# you can create column header for no header data at once
df = pd.read_csv('/content/drive/MyDrive/Lecture/삼성 디스플레이/1주차/1_python_basic/data/friend_list_no_head.csv', header = None, names=['name', 'age', 'job'])
df
df_filtered = df[['name', 'age']]
df_filtered
df.filter(items=['age', 'job'])
df
원하는 글자를 가진 로우를 보여줍니다.
# select columns containing 'a'
df.filter(like='a',axis=1)
정규식으로 필터도 가능합니다.
# select columns using regex
df.filter(regex='b$',axis=1)
로우 인덱스로 로우를 드롭할 수 있습니다.
friend_dict_list = [{'age': 20, 'job': 'student'},
{'age': 30, 'job': 'developer'},
{'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list, index = ['John', 'Jenny', 'Nate'])
df.head()
드롭된 결과는 데이터프레임에 저장되지 않습니다. 저장하고 싶으실 경우, 결과를 데이터프레임에 따로 저장하셔야 합니다
df.drop(['John', 'Nate'])
df
드롭된 결과를 데이터프레임에 저장하는 예제입니다.
df = df.drop(['John', 'Nate'])
df
inplace 키워드를 사용하시면, 따로 저장할 필요없이, 드롭된 결과가 데이터프레임에 반영됩니다.
friend_dict_list = [{'age': 20, 'job': 'student'},
{'age': 30, 'job': 'developer'},
{'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list, index = ['John', 'Jenny', 'Nate'])
df.drop(['John', 'Nate'], inplace = True)
df
friend_dict_list = [{'name': 'Jone', 'age': 20, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list)
df
로우 인덱스로 드롭하는 예제입니다.
df = df.drop(df.index[[0,2]])
df
friend_dict_list = [{'name': 'Jone', 'age': 20, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list)
df
df = df[df.age != 30]
df
friend_dict_list = [{'name': 'Jone', 'age': 20, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list)
df
df = df.drop('age', axis=1)
df
friend_dict_list = [{'name': 'Jone', 'age': 15, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list, columns = ['name', 'age', 'job'])
df
아래와 같은 방법으로 새로운 컬럼을 기본값과 함께 추가하실 수 있습니다.
df['salary'] = 0
df
기존 컬럼값을 가지고 새로운 컬럼을 생성하는 예제입니다.
friend_dict_list = [{'name': 'Jone', 'age': 15, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list, columns = ['name', 'age', 'job'])
df
넘파이를 사용하셔서, 한줄에 새로운 컬럼값을 생성하실 수도 있습니다.
import numpy as np
df['salary'] = np.where(df['job'] != 'student' , 'yes', 'no')
df
friend_dict_list = [{'name': 'John', 'midterm': 95, 'final': 85},
{'name': 'Jenny', 'midterm': 85, 'final': 80},
{'name': 'Nate', 'midterm': 10, 'final': 30}]
df = pd.DataFrame(friend_dict_list, columns = ['name', 'midterm', 'final'])
df
아래는 기존에 있는 두 컬럼값을 더해서 새로운 컬럼을 만드는 예제입니다.
df['total'] = df['midterm'] + df['final']
df
기존의 컬럼을 사용하여 새로운 컬럼을 만드는 예제입니다.
df['average'] = df['total'] / 2
df
아래와 같이, 리스트에 조건별 값을 담아서, 새로운 컬럼으로 추가시킬 수 있습니다
grades = []
for row in df['average']:
if row >= 90:
grades.append('A')
elif row >= 80:
grades.append('B')
elif row >= 70:
grades.append('C')
else:
grades.append('F')
df['grade'] = grades
df
apply 함수 사용 예제입니다.
apply를 사용하시면, 깔끔하게 컬럼의 값을 변경하는 코드를 구현하실 수 있습니다.
def pass_or_fail(row):
print(row)
if row != "F":
return 'Pass'
else:
return 'Fail'
df.grade = df.grade.apply(pass_or_fail)
df
apply를 사용해서 연월일의 정보에서 연도만 빼보는 예제입니다.
date_list = [{'yyyy-mm-dd': '2000-06-27'},
{'yyyy-mm-dd': '2002-09-24'},
{'yyyy-mm-dd': '2005-12-20'}]
df = pd.DataFrame(date_list, columns = ['yyyy-mm-dd'])
df
def extract_year(row):
return row.split('-')[0]
df['year'] = df['yyyy-mm-dd'].apply(extract_year)
df
키워드 파라미터를 사용하시면, apply가 적용된 함수에 파라미터를 전달하실 수 있습니다.
def extract_year(year, current_year):
return current_year - int(year)
df['age'] = df['year'].apply(extract_year, current_year=2018)
df
키워드 파라미터를 추가해주시면, 원하시는만큼의 파라미터를 함수에 전달 가능합니다.
def get_introduce(age, prefix, suffix):
return prefix + str(age) + suffix
df['introduce'] = df['age'].apply(get_introduce, prefix="I am ", suffix=" years old")
df
axis=1이라는 키워드 파라미터를 apply 함수에 전달해주면, 모든 컬럼을 지정된 함수에서 사용 가능합니다.
def get_introduce2(row):
return "I was born in "+str(row.year)+" my age is "+str(row.age)
df.introduce = df.apply(get_introduce2, axis=1)
df
파라미터로 함수를 전달하면 apply 함수와 동일하게 컬럼값을 추가 및 변경할 수 있습니다.
def extract_year(row):
return row.split('-')[0]
date_list = [{'yyyy-mm-dd': '2000-06-27'},
{'yyyy-mm-dd': '2002-09-24'},
{'yyyy-mm-dd': '2005-12-20'}]
df = pd.DataFrame(date_list, columns = ['yyyy-mm-dd'])
df
df['year'] = df['yyyy-mm-dd'].map(extract_year)
df
파라미터로 딕셔너리를 전달하면 컬럼값을 쉽게 원하는 값으로 변경 가능합니다.
기존의 컬럼값은 딕셔너리의 key로 사용되고, 해당되는 value의 값으로 컬럼값이 변경됩니다.
job_list = [{'age': 20, 'job': 'student'},
{'age': 30, 'job': 'developer'},
{'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(job_list)
df
df.job = df.job.map({"student":1,"developer":2,"teacher":3})
df
데이터프레임 전체의 각각의 값을 한번에 변경시키실 때 사용하시면 좋습니다.
x_y = [{'x': 5.5, 'y': -5.6},
{'x': -5.2, 'y': 5.5},
{'x': -1.6, 'y': -4.5}]
df = pd.DataFrame(x_y)
df
df = df.applymap(np.around)
df
friend_dict_list = [{'name': 'John', 'midterm': 95, 'final': 85},
{'name': 'Jenny', 'midterm': 85, 'final': 80},
{'name': 'Nate', 'midterm': 10, 'final': 30}]
df = pd.DataFrame(friend_dict_list, columns = ['name', 'midterm', 'final'])
df
df2 = pd.DataFrame([['Ben', 50,50]], columns = ['name', 'midterm', 'final'])
df2.head()
df.append(df2, ignore_index=True)
데이터에서 정보를 취하기 위해서 그룹별로 묶는 방법에 대해 알아보겠습니다.
student_list = [{'name': 'John', 'major': "Computer Science", 'sex': "male"},
{'name': 'Nate', 'major': "Computer Science", 'sex': "male"},
{'name': 'Abraham', 'major': "Physics", 'sex': "male"},
{'name': 'Brian', 'major': "Psychology", 'sex': "male"},
{'name': 'Janny', 'major': "Economics", 'sex': "female"},
{'name': 'Yuna', 'major': "Economics", 'sex': "female"},
{'name': 'Jeniffer', 'major': "Computer Science", 'sex': "female"},
{'name': 'Edward', 'major': "Computer Science", 'sex': "male"},
{'name': 'Zara', 'major': "Psychology", 'sex': "female"},
{'name': 'Wendy', 'major': "Economics", 'sex': "female"},
{'name': 'Sera', 'major': "Psychology", 'sex': "female"}
]
df = pd.DataFrame(student_list, columns = ['name', 'major', 'sex'])
df
groupby_major = df.groupby('major')
df.groupby('major')['name']
#<pandas.core.groupby.generic.SeriesGroupBy object at 0x7f31f524a0b0>
groupby_major.groups
#{'Computer Science': [0, 1, 6, 7], 'Economics': [4, 5, 9], 'Physics': [2], 'Psychology': [3, 8, 10]}
here we can see, computer science has mostly man, while economic has mostly woman students
for name, group in groupby_major:
print(name + ": " + str(len(group)))
print(group)
print()
Computer Science: 4
name major sex
0 John Computer Science male
1 Nate Computer Science male
6 Jeniffer Computer Science female
7 Edward Computer Science male
Economics: 3
name major sex
4 Janny Economics female
5 Yuna Economics female
9 Wendy Economics female
Physics: 1
name major sex
2 Abraham Physics male
Psychology: 3
name major sex
3 Brian Psychology male
8 Zara Psychology female
10 Sera Psychology female
그룹 객체를 다시 데이터프레임으로 생성하는 예제입니다.
df_major_cnt = pd.DataFrame({'count' : groupby_major.size()}).reset_index()
df_major_cnt
groupby_sex = df.groupby('sex')
아래의 출력을 통해, 이 학교의 남녀 성비가 균등하다는 정보를 알 수 있습니다.
for name, group in groupby_sex:
print(name + ": " + str(len(group)))
print(group)
print()
female: 6
name major sex
4 Janny Economics female
5 Yuna Economics female
6 Jeniffer Computer Science female
8 Zara Psychology female
9 Wendy Economics female
10 Sera Psychology female
male: 5
name major sex
0 John Computer Science male
1 Nate Computer Science male
2 Abraham Physics male
3 Brian Psychology male
7 Edward Computer Science male
df_sex_cnt = pd.DataFrame({'count' : groupby_sex.size()}).reset_index()
df_sex_cnt
중복된 데이터 드롭하는 방법에 대해 알아보겠습니다.
student_list = [{'name': 'John', 'major': "Computer Science", 'sex': "male"},
{'name': 'Nate', 'major': "Computer Science", 'sex': "male"},
{'name': 'Abraham', 'major': "Physics", 'sex': "male"},
{'name': 'Brian', 'major': "Psychology", 'sex': "male"},
{'name': 'Janny', 'major': "Economics", 'sex': "female"},
{'name': 'Yuna', 'major': "Economics", 'sex': "female"},
{'name': 'Jeniffer', 'major': "Computer Science", 'sex': "female"},
{'name': 'Edward', 'major': "Computer Science", 'sex': "male"},
{'name': 'Zara', 'major': "Psychology", 'sex': "female"},
{'name': 'Wendy', 'major': "Economics", 'sex': "female"},
{'name': 'Sera', 'major': "Psychology", 'sex': "female"},
{'name': 'John', 'major': "Computer Science", 'sex': "male"},
]
df = pd.DataFrame(student_list, columns = ['name', 'major', 'sex'])
df
df.duplicated()
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 True
dtype: bool
drop_duplicates 함수로 중복 데이터를 삭제하는 예제입니다
df = df.drop_duplicates()
df
student_list = [{'name': 'John', 'major': "Computer Science", 'sex': "male"},
{'name': 'Nate', 'major': "Computer Science", 'sex': "male"},
{'name': 'Abraham', 'major': "Physics", 'sex': "male"},
{'name': 'Brian', 'major': "Psychology", 'sex': "male"},
{'name': 'Janny', 'major': "Economics", 'sex': "female"},
{'name': 'Yuna', 'major': "Economics", 'sex': "female"},
{'name': 'Jeniffer', 'major': "Computer Science", 'sex': "female"},
{'name': 'Edward', 'major': "Computer Science", 'sex': "male"},
{'name': 'Zara', 'major': "Psychology", 'sex': "female"},
{'name': 'Wendy', 'major': "Economics", 'sex': "female"},
{'name': 'Nate', 'major': None, 'sex': "male"},
{'name': 'John', 'major': "Computer Science", 'sex': None},
]
df = pd.DataFrame(student_list, columns = ['name', 'major', 'sex'])
df
name 컬럼이 똑같을 경우, 중복된 데이터라고 표시하라는 예제입니다.
df.duplicated(['name'])
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 True
11 True
dtype: bool
keep 값을 first 또는 last라고 값을 줘서 중복된 값 중, 어느값을 살릴 지 결정하실 수 있습니다.
기본적으로 first로 설정되어 있습니다.
df.drop_duplicates(['name'], keep='last')
df
school_id_list = [{'name': 'John', 'job': "teacher", 'age': 40},
{'name': 'Nate', 'job': "teacher", 'age': 35},
{'name': 'Yuna', 'job': "teacher", 'age': 37},
{'name': 'Abraham', 'job': "student", 'age': 10},
{'name': 'Brian', 'job': "student", 'age': 12},
{'name': 'Janny', 'job': "student", 'age': 11},
{'name': 'Nate', 'job': "teacher", 'age': None},
{'name': 'John', 'job': "student", 'age': None}
]
df = pd.DataFrame(school_id_list, columns = ['name', 'job', 'age'])
df
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 8 non-null object
1 job 8 non-null object
2 age 6 non-null float64
dtypes: float64(1), object(2)
memory usage: 320.0+ bytes
df.isna()
df.isnull()
아래는 Null을 0으로 설정하는 예제입니다.
tmp = df
tmp["age"] = tmp["age"].fillna(0)
tmp
0으로 설정하기 보다는 선생님의 중간 나이, 학생의 중간 나이로, 각각의 직업군에 맞게 Null값을 변경해줍니다.
# fill missing age with median age for each group (teacher, student)
df["age"].fillna(df.groupby("job")["age"].transform("median"), inplace=True)
df
컬럼에 여러 값이 있을 때, 중복 없이 어떤 값들이 있는 지 확인하는 방법입니다.
job_list = [{'name': 'John', 'job': "teacher"},
{'name': 'Nate', 'job': "teacher"},
{'name': 'Fred', 'job': "teacher"},
{'name': 'Abraham', 'job': "student"},
{'name': 'Brian', 'job': "student"},
{'name': 'Janny', 'job': "developer"},
{'name': 'Nate', 'job': "teacher"},
{'name': 'Obrian', 'job': "dentist"},
{'name': 'Yuna', 'job': "teacher"},
{'name': 'Rob', 'job': "lawyer"},
{'name': 'Brian', 'job': "student"},
{'name': 'Matt', 'job': "student"},
{'name': 'Wendy', 'job': "banker"},
{'name': 'Edward', 'job': "teacher"},
{'name': 'Ian', 'job': "teacher"},
{'name': 'Chris', 'job': "banker"},
{'name': 'Philip', 'job': "lawyer"},
{'name': 'Janny', 'job': "basketball player"},
{'name': 'Gwen', 'job': "teacher"},
{'name': 'Jessy', 'job': "student"}
]
df = pd.DataFrame(job_list, columns = ['name', 'job'])
컬럼(시리즈)의 unique() 함수를 사용하여, 중복 없이, 컬럼에 있는 모든 값들을 출력할 수 있습니다.
print( df.job.unique() )
['teacher' 'student' 'developer' 'dentist' 'lawyer' 'banker'
'basketball player']
각 유니크한 값별로 몇개의 데이터가 속하는 지 value_counts() 함수로 확인할 수 있습니다.
df.job.value_counts()
teacher 8
student 5
lawyer 2
banker 2
developer 1
dentist 1
basketball player 1
Name: job, dtype: int64
l1 = [{'name': 'John', 'job': "teacher"},
{'name': 'Nate', 'job': "student"},
{'name': 'Fred', 'job': "developer"}]
l2 = [{'name': 'Ed', 'job': "dentist"},
{'name': 'Jack', 'job': "farmer"},
{'name': 'Ted', 'job': "designer"}]
df1 = pd.DataFrame(l1, columns = ['name', 'job'])
df2 = pd.DataFrame(l2, columns = ['name', 'job'])
두번째 데이터프레임을 첫번째 데이터프레임의 새로운 로우(행)로 합칩니다.
frames = [df1, df2]
result = pd.concat(frames, ignore_index=True)
result
두번째 데이터프레임을 첫번째 데이터프레임의 새로운 로우(행)로 합칩니다.
l1 = [{'name': 'John', 'job': "teacher"},
{'name': 'Nate', 'job': "student"},
{'name': 'Fred', 'job': "developer"}]
l2 = [{'name': 'Ed', 'job': "dentist"},
{'name': 'Jack', 'job': "farmer"},
{'name': 'Ted', 'job': "designer"}]
df1 = pd.DataFrame(l1, columns = ['name', 'job'])
df2 = pd.DataFrame(l2, columns = ['name', 'job'])
result = df1.append(df2, ignore_index=True)
<ipython-input-151-3327dac28767>:11: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
result = df1.append(df2, ignore_index=True)
result
두번째 데이터프레임을 첫번째 데이터프레임의 새로운 컬럼(열)으로 합칩니다.
l1 = [{'name': 'John', 'job': "teacher"},
{'name': 'Nate', 'job': "student"},
{'name': 'Jack', 'job': "developer"}]
l2 = [{'age': 25, 'country': "U.S"},
{'age': 30, 'country': "U.K"},
{'age': 45, 'country': "Korea"}]
df1 = pd.DataFrame(l1, columns = ['name', 'job'])
df2 = pd.DataFrame(l2, columns = ['age', 'country'])
result = pd.concat([df1, df2], axis=1, ignore_index=True)
result
label = [1,2,3,4,5]
prediction = [1,2,2,5,5]
comparison = pd.DataFrame(
{'label': label,
'prediction': prediction
})
comparison