五、Pandas小結(3)— 資料合併及分組
阿新 • • 發佈:2019-01-28
#資料合併及分組
# 一、資料合併
import pandas as pd
staff_df = pd.DataFrame([{'姓名': '張三', '部門': '研發部'},
{'姓名': '李四', '部門': '財務部'},
{'姓名': '趙六', '部門': '市場部'}])
student_df = pd.DataFrame([{'姓名': '張三', '專業': '計算機'},
{'姓名': '李四', '專業': '會計'},
{'姓名': '王五', '專業': '市場營銷'}])
print(staff_df)
print()
print(student_df)
pd.merge(staff_df, student_df, how='outer', on='姓名')
#或
staff_df.merge(student_df, how='outer', on='姓名')
pd.merge(staff_df, student_df, how='inner', on='姓名')
# 或者
# staff_df.merge(student_df, how='inner', on='姓名')
pd.merge(staff_df, student_df, how='left', on='姓名')
# 或者
# staff_df.merge(student_df, how='left', on='姓名')
pd.merge(staff_df, student_df, how='right', on='姓名')
# 或者
# staff_df.merge(student_df, how='right', on='姓名')
# 也可以按索引進行合併
staff_df.set_index('姓名', inplace=True)
student_df.set_index('姓名', inplace=True)
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_index=True, right_index=True)
# 或者
# staff_df.merge(student_df, how='left', left_index=True, right_index=True)
# 當資料中的列名不同時,使用left_on,right_on
staff_df.reset_index(inplace=True)
student_df.reset_index(inplace=True)
print(staff_df)
print(student_df)
staff_df.rename(columns={'姓名': '員工姓名'}, inplace=True)
student_df.rename(columns={'姓名': '學生姓名'}, inplace=True)
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_on='員工姓名',right_on='學生姓名')
# 如果兩個資料中包含有相同的列名(不是要合併的列)時,merge會自動加字尾作為區別
staff_df['地址'] = ['天津', '北京', '上海']
student_df['地址'] = ['天津', '上海', '廣州']
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_on='員工姓名', right_on='學生姓名')
# 也可指定字尾名稱
pd.merge(staff_df, student_df, how='left', left_on='員工姓名', right_on='學生姓名', suffixes = ('(公司)','(家鄉)'))
# 也可以指定多列進行合併,找出同一個人的工作地址和家鄉地址相同的記錄
pd.merge(staff_df, student_df, how='inner', left_on=['員工姓名', '地址'], right_on=['學生姓名', '地址'])
# apply使用
# 獲取姓
staff_df['員工姓名'].apply(lambda x: x[0])
# 獲取名
staff_df['員工姓名'].apply(lambda x : x[1:])
# 結果合併
staff_df.loc[:, '姓'] = staff_df['員工姓名'].apply(lambda x: x[0])
staff_df.loc[:, '名'] = staff_df['員工姓名'].apply(lambda x: x[1:])
print(staff_df)
staff_df
# 二、資料分組
report_data = pd.read_csv('./2015.csv')
grouped['Happiness Score'].mean()
grouped.size()
# 迭代groupby物件
for group, frame in grouped:
mean_score = frame['Happiness Score'].mean()
max_score = frame['Happiness Score'].max()
min_score = frame['Happiness Score'].min()
print('{}地區的平均幸福指數:{},最高幸福指數:{},最低幸福指數{}'.format(group, mean_score, max_score, min_score))
# 自定義函式進行分組
# 按照幸福指數排名進行劃分,1-10, 10-20, >20
# 如果自定義函式,操作針對的是index
report_data2 = report_data.set_index('Happiness Rank')
def get_rank_group(rank):
rank_group = ''
if rank <= 10:
rank_group = '0 -- 10'
elif rank <= 20:
rank_group = '10 -- 20'
else:
rank_group = '> 20'
return rank_group
grouped=report_data2.groupby(get_rank_group)
for group ,frame in grouped:
print('{}分組的資料個數: {}'.format(group, len(frame)))
# 實際專案中,通常可以先人為構造出一個分組列,然後再進行groupby
# 按照score的整數部分進行分組
# 按照幸福指數排名進行劃分,1-10, 10-20, >20
# 如果自定義函式,操作針對的是index
report_data['score group'] = report_data['Happiness Score'].apply(lambda score: int(score))
grouped = report_data.groupby('score group')
for group, frame in grouped:
print('幸福指數整數部分為{}的分組資料個數:{}'.format(group, len(frame)))
import numpy as np
grouped.agg({'Happiness Score': np.mean, 'Happiness Rank': np.max})
grouped['Happiness Score'].agg(func)
# 一、資料合併
import pandas as pd
staff_df = pd.DataFrame([{'姓名': '張三', '部門': '研發部'},
{'姓名': '李四', '部門': '財務部'},
{'姓名': '趙六', '部門': '市場部'}])
student_df = pd.DataFrame([{'姓名': '張三', '專業': '計算機'},
{'姓名': '李四', '專業': '會計'},
{'姓名': '王五', '專業': '市場營銷'}])
print(staff_df)
print()
print(student_df)
pd.merge(staff_df, student_df, how='outer', on='姓名')
#或
staff_df.merge(student_df, how='outer', on='姓名')
pd.merge(staff_df, student_df, how='inner', on='姓名')
# 或者
# staff_df.merge(student_df, how='inner', on='姓名')
pd.merge(staff_df, student_df, how='left', on='姓名')
# 或者
# staff_df.merge(student_df, how='left', on='姓名')
pd.merge(staff_df, student_df, how='right', on='姓名')
# 或者
# staff_df.merge(student_df, how='right', on='姓名')
# 也可以按索引進行合併
staff_df.set_index('姓名', inplace=True)
student_df.set_index('姓名', inplace=True)
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_index=True, right_index=True)
# 或者
# staff_df.merge(student_df, how='left', left_index=True, right_index=True)
# 當資料中的列名不同時,使用left_on,right_on
staff_df.reset_index(inplace=True)
student_df.reset_index(inplace=True)
print(staff_df)
print(student_df)
staff_df.rename(columns={'姓名': '員工姓名'}, inplace=True)
student_df.rename(columns={'姓名': '學生姓名'}, inplace=True)
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_on='員工姓名',right_on='學生姓名')
# 如果兩個資料中包含有相同的列名(不是要合併的列)時,merge會自動加字尾作為區別
staff_df['地址'] = ['天津', '北京', '上海']
student_df['地址'] = ['天津', '上海', '廣州']
print(staff_df)
print(student_df)
pd.merge(staff_df, student_df, how='left', left_on='員工姓名', right_on='學生姓名')
# 也可指定字尾名稱
pd.merge(staff_df, student_df, how='left', left_on='員工姓名', right_on='學生姓名', suffixes = ('(公司)','(家鄉)'))
# 也可以指定多列進行合併,找出同一個人的工作地址和家鄉地址相同的記錄
pd.merge(staff_df, student_df, how='inner', left_on=['員工姓名', '地址'], right_on=['學生姓名', '地址'])
# apply使用
# 獲取姓
staff_df['員工姓名'].apply(lambda x: x[0])
# 獲取名
staff_df['員工姓名'].apply(lambda x : x[1:])
# 結果合併
staff_df.loc[:, '姓'] = staff_df['員工姓名'].apply(lambda x: x[0])
staff_df.loc[:, '名'] = staff_df['員工姓名'].apply(lambda x: x[1:])
print(staff_df)
staff_df
# 二、資料分組
report_data = pd.read_csv('./2015.csv')
report_data.head()
grouped = report_data.groupby('Region')
print(type(grouped))grouped['Happiness Score'].mean()
grouped.size()
# 迭代groupby物件
for group, frame in grouped:
mean_score = frame['Happiness Score'].mean()
max_score = frame['Happiness Score'].max()
min_score = frame['Happiness Score'].min()
print('{}地區的平均幸福指數:{},最高幸福指數:{},最低幸福指數{}'.format(group, mean_score, max_score, min_score))
# 自定義函式進行分組
# 按照幸福指數排名進行劃分,1-10, 10-20, >20
# 如果自定義函式,操作針對的是index
report_data2 = report_data.set_index('Happiness Rank')
def get_rank_group(rank):
rank_group = ''
if rank <= 10:
rank_group = '0 -- 10'
elif rank <= 20:
rank_group = '10 -- 20'
else:
rank_group = '> 20'
return rank_group
grouped=report_data2.groupby(get_rank_group)
for group ,frame in grouped:
print('{}分組的資料個數: {}'.format(group, len(frame)))
# 實際專案中,通常可以先人為構造出一個分組列,然後再進行groupby
# 按照score的整數部分進行分組
# 按照幸福指數排名進行劃分,1-10, 10-20, >20
# 如果自定義函式,操作針對的是index
report_data['score group'] = report_data['Happiness Score'].apply(lambda score: int(score))
grouped = report_data.groupby('score group')
for group, frame in grouped:
print('幸福指數整數部分為{}的分組資料個數:{}'.format(group, len(frame)))
import numpy as np
grouped.agg({'Happiness Score': np.mean, 'Happiness Rank': np.max})
grouped['Happiness Score'].agg(func)