1. 程式人生 > >五、Pandas小結(3)— 資料合併及分組

五、Pandas小結(3)— 資料合併及分組

#資料合併及分組
# 一、資料合併
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)