Python_47_ pandas(2)

hyeong taek jo·2023년 9월 20일

Python

목록 보기
51/53

📌 리스트를 dict로 변환

import pandas as pd

friend_list = [
                ['name',['백승호', '황희찬', '손흥민']],
                ['age',[20,28,39]],
                ['job',['HR', 'ACCOUNT' , 'player']]
                ]

#일단 리스트를 dict로 변환
print('1. friend_list df --> {}'.format(friend_list))
dict1 =dict(friend_list)
print('2. dictionary dict1--> {}'.format(dict1))

# dict를 dataFrame로 변환
df = pd.DataFrame.from_dict(dict1)
print('3.dict를 dataFrame로 df--> {}'.format(df))

# select rows from index 1 to index 2 : dataFrame 범위
print('4. df index 1 to index 2 df[1:3]--> {}'.format(df[1:3]))

# dataFrame 해당 Row선택 범위 -> select row index 0 and index 2
print('5. df index 1 to index 2 df.loc[[0,2]]-->{}'.format(df.loc[[0,2]]))
  1. friend_list df --> [['name', ['백승호', '황희찬', '손흥민']], ['age', [20, 28, 39]], ['job', ['HR', 'ACCOUNT', 'player']]]
  2. dictionary dict1--> {'name': ['백승호', '황희찬', '손흥민'], 'age': [20, 28, 39], 'job': ['HR', 'ACCOUNT', 'player']}
    3.dict를 dataFrame로 df--> name age job
    0 백승호 20 HR
    1 황희찬 28 ACCOUNT
    2 손흥민 39 player
  3. df index 1 to index 2 df[1:3]--> name age job
    1 황희찬 28 ACCOUNT
    2 손흥민 39 player
  4. df index 1 to index 2 df.loc[[0,2]]--> name age job
    0 백승호 20 HR
    2 손흥민 39 player

📌 컬럼에 조건걸기

######################################################
# 2. by column condition
######################################################
df_filtered = df[df.age > 25]
print('6. df df.age > 25 : df_filtered --> {}'.format(df_filtered))

df_query = df.query('age>37')
print('7.df query [df.age > 37] : df_query-->{}'.format(df_query))

df_filtered = df[(df.age > 25) & (df.name == '손흥민')]
print("8.df[(df.age > 25) & (df.name == '손흥민')] : df_query->{}".format(df_filtered))
  1. df df.age > 25 : df_filtered -->
    name age job
    1 황희찬 28 ACCOUNT
    2 손흥민 39 player
    7.df query [df.age > 37] : df_query--> name age job
    2 손흥민 39 player
    8.df[(df.age > 25) & (df.name == '손흥민')] : df_query-> name age job
    2 손흥민 39 player

📌 컬럼 추가 및 변경

######################################################
# Add Column / Update Column
######################################################
# 1. Add New Column with default value
######################################################

import pandas as pd
import numpy as np

friend_dict_list = [{'name': 'Jone', 'age': 15, 'job': 'student'},
                    {'name': 'Jenny', 'age': 30, 'job': 'developer'},
                    {'name': 'Nate', 'age': 30, 'job': 'teacher'}]

#dict를  dataFrame로 변환
df = pd.DataFrame(friend_dict_list, columns= ['name', 'age', 'job'])
print('---------------1. friend_dict_list df ----------')
print(df)

# Add New Column with default value
df['salary'] = 0
print('--------------------2.Add Column df -----------')
print('2.df--> ',df)

# Add  true or false condition
df['salary'] = np.where(df['job'] != 'student' , 'yes' , 'no')
print('----- 3. Add Column true or false condition df ----')
print(df)

---------------1. friend_dict_list df ----------
name age job
0 Jone 15 student
1 Jenny 30 developer
2 Nate 30 teacher
--------------------2.Add Column df -----------
2.df--> name age job salary
0 Jone 15 student 0
1 Jenny 30 developer 0
2 Nate 30 teacher 0
----- 3. Add Column true or false condition df ----
name age job salary
0 Jone 15 student no
1 Jenny 30 developer yes
2 Nate 30 teacher yes


📌 컬럼추가 응용

import pandas as pd

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'])
print('---------------1.date_list df --------------')
print(df)

# row 별 String을 '-'로 분리 첫번째 Column Get

def extract_year(row):
    return row.split('-')[0]

# row 별 해당년도에서 현재년도를 뺌 -> 나이
def extract_age(year, current_year):
    return current_year - int(year)

# passing multiple keyword parameter to apply function
# you also can send multiple parameter to apply function
def get_introduce(age, prefix, suffix):
    return prefix + str(age) + suffix
                                #apply는 데이터프레임의 처음부터 끝까지 돌아간다.
df['year'] = df['yyyy-mm-dd'].apply(extract_year)
print('2.df->')
print(df)
df['age'] = df['year'].apply(extract_age, current_year=2023)
print('3. df -> ')
print(df)
df['intruduce'] = df['age'].apply(get_introduce,
                                  prefix="I am ",
                                  suffix=" years old")
print('------------------ 2. df apply ------------')
print('4.df-->')
print(df)

---------------1.date_list df --------------
yyyy-mm-dd
0 2000-06-27
1 2002-09-24
2 2005-12-20
2.df->
yyyy-mm-dd year
0 2000-06-27 2000
1 2002-09-24 2002
2 2005-12-20 2005
3. df ->
yyyy-mm-dd year age
0 2000-06-27 2000 23
1 2002-09-24 2002 21
2 2005-12-20 2005 18
------------------ 2. df apply ------------
4.df-->
yyyy-mm-dd year age intruduce
0 2000-06-27 2000 23 I am 23 years old
1 2002-09-24 2002 21 I am 21 years old
2 2005-12-20 2005 18 I am 18 years old


📌 그룹

######################################################
# Group by
######################################################
# group by command helps to get more information from given data
######################################################
import pandas as pd

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'])
print('-----------------------1.student_list df -------------')
print(df)

groupby_major = df.groupby('major')
print('---------------- 2.student_list groupby_major ---------------')
print(groupby_major)


for name, group in groupby_major: #name은 그룹의 명을 뜻한다.
    print(name + ":" + str(len(group)))
    print(group)
    print()

print('---------------4.student_list groupby_sex')
groupby_sex = df.groupby('sex')
for name, group in groupby_sex:
    print(name + ": " + str(len(group)))
    print(group)
    print()

-----------------------1.student_list df -------------
name major sex
0 John Computer Science male
1 Nate Computer Science male
2 Abraham Physics male
3 Brian Psychology male
4 Janny Economics female
5 Yuna Economics female
6 Jeniffer Computer Science female
7 Edward Computer Science male
8 Zara Psychology female
9 Wendy Economics female
10 Sera Psychology female
---------------- 2.student_list groupby_major ---------------
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000021E48977350>
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

---------------4.student_list groupby_sex
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


📌 널(Null) 채우기

######################################################
#  None value 처리
######################################################

import pandas as pd

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'])

print('---------------1.school_id_list----------')
print(df)

#how to check if there if Null or NoN
print('------------- 2-1.how to check df.info()-------------')
print(df.info())


print('-------------------2-2.how to check df.isna()----------------')
#na 는 Numpy의 Na(Not a Number)값을  의미
print(df.isna())
print('-----------------2-3.how to check df.isnull()-------------')
#isna의 별칭
print(df.isnull())

# how to fill Null or NaN
print('---------  3.NULL OR NaN 채우기----------')
tmp = df
tmp['age'] = tmp['age'].fillna(0)
print(tmp)

print('---------  4.fillna groupby [그룹별  job 평균값] 으로 채우기----------')
# fill missing age with median age for each group (teacher, student)
df = pd.DataFrame(school_id_list, columns= ['name', 'job', 'age'])
df["age"].fillna(df.groupby("job")["age"].transform('median'), inplace=True)

print(df)

---------------1.school_id_list----------
name job age
0 John teacher 40.0
1 Nate teacher 35.0
2 Yuna teacher 37.0
3 Abraham student 10.0
4 Brian student 12.0
5 Janny student 11.0
6 Nate teacher NaN
7 John student NaN
------------- 2-1.how to check 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: 324.0+ bytes
None
-------------------2-2.how to check df.isna()----------------
name job age
0 False False False
1 False False False
2 False False False
3 False False False
4 False False False
5 False False False
6 False False True
7 False False True
-----------------2-3.how to check df.isnull()-------------
name job age
0 False False False
1 False False False
2 False False False
3 False False False
4 False False False
5 False False False
6 False False True
7 False False True
--------- 3.NULL OR NaN 채우기----------
name job age
0 John teacher 40.0
1 Nate teacher 35.0
2 Yuna teacher 37.0
3 Abraham student 10.0
4 Brian student 12.0
5 Janny student 11.0
6 Nate teacher 0.0
7 John student 0.0
--------- 4.fillna groupby [그룹별 job 평균값] 으로 채우기----------
name job age
0 John teacher 40.0
1 Nate teacher 35.0
2 Yuna teacher 37.0
3 Abraham student 10.0
4 Brian student 12.0
5 Janny student 11.0
6 Nate teacher 37.0
7 John student 11.0


📌 Unique 처리(중복제거)

######################################################
#  Unique 처리
######################################################
import pandas as pd

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'])

print('--------------1.job_list df -----------')
print(df)

# unique()    :   SQL distinct 비숫
print('---------   2.unique df   ----------')
print(df.job.unique())

# value_counts() gives you the number of item for each unique columns
print('---------   3.value_counts df   ----------')
print(df.job.value_counts())

--------------1.job_list df -----------
name job
0 John teacher
1 Nate teacher
2 Fred teacher
3 Abraham student
4 Brian student
5 Janny developer
6 Nate teacher
7 Obrian dentist
8 Yuna teacher
9 Rob lawyer
10 Brian student
11 Matt student
12 Wendy banker
13 Edward teacher
14 Ian teacher
15 Chris banker
16 Philip lawyer
17 Janny basketball player
18 Gwen teacher
19 Jessy student
--------- 2.unique df ----------
['teacher' 'student' 'developer' 'dentist' 'lawyer' 'banker'
'basketball player']
--------- 3.value_counts df ----------
job
teacher 8
student 5
lawyer 2
banker 2
developer 1
dentist 1
basketball player 1
Name: count, dtype: int64


📌 concat(배열 붙이기)

import pandas as pd

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'])

print('--------1. df1 ----------')
print(df1)

print('--------2. df2 ----------')
print(df2)

print('---------   3. pd.concat  ----------')
# pd.concat
# below is to add second dataframe as new rows in first dataframe
frames = [df1, df2]
result = pd.concat(frames, ignore_index=True)
print(result)

--------1. df1 ----------
name job
0 John teacher
1 Nate student
2 Fred developer
--------2. df2 ----------
name job
0 Ed dentist
1 Jack farmer
2 Ted designer
--------- 3. pd.concat ----------
name job
0 John teacher
1 Nate student
2 Fred developer
3 Ed dentist
4 Jack farmer
5 Ted designer

profile
마포구 주민

0개의 댓글