第二章:02数据重构

1.了解数据重构的方法

2.学会使用groupby作数据运算

什么是数据重构?
数据重构:指数据从一种格式到另一种格式的转换,包括结构转换、格式变化、类型替换等,以解决空间数据在结构、格式和类型上的统一,实现多源和异构数据的联接与融合。

合并数据集 stack

使用pandas进行数据重排时,经常用到stack和unstack两个函数。stack的意思是堆叠,堆积,unstack即”不要堆叠”。
常见的数据层次化结构有:花括号和表格。

表格在行列方向上均有索引(类似于DataFrame)。
花括号结构只有”列方向”上的索引(类似于层次化的Series)。
stack函数会将数据从”表格结构”变成”花括号结构”,即将其行索引变成列索引,反之,unstack函数将数据从”花括号结构”变成”表格结构”,即要将其中一层的列索引变成行索引。
stack:stack函数会将数据从”表格结构”变成”花括号结构” ,将列索引转为行索引,完成层级索引
unstack:unstack函数将数据从”花括号结构”变成”表格结构”,层级索引展开 ,默认操作内层索引

df_obj = pd.DataFrame(np.random.randint(0,10, (5,2)), columns=['data1', 'data2'])
df_obj

第二章:02数据重构
stacked = df_obj.stack()
print(stacked)
stackedd=stacked.unstack()
print(stacked)

代码结果如下所示·:

第二章:02数据重构

concat

Pandas中的pd.concat与np.concatenate类似,但可选参数更多,功能更为强大。

pd.concat可以简单地合并一维的对象:

ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
pd.concat([ser1, ser2])

多维数据合并:

df1 = make_df('AB', [1, 2])
df2 = make_df('AB', [3, 4])
display('df1', 'df2', 'pd.concat([df1, df2])')

numpy中concatenate和pd.concat的很像。
他俩的主要差异就在于pd.concat在合并时会保留索引,即使索引是重复的。但是pandas中也提供了检查重复索引和忽略索引的参数,见上表。
【代码实现】

#构造一个函数,方便后面表示
x = make_df('AB', [0, 1])
y = make_df('AB', [2, 3])
y.index = x.index # 复制索引
display('x', 'y', 'pd.concat([x, y])')
#捕捉索引重复
try:
    pd.concat([x, y], verify_integrity=True)
except ValueError as e:
    print("ValueError:", e)
#忽略索引
display('x', 'y', 'pd.concat([x, y], ignore_index=True)')
#增加多级索引
display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")

join

通过索引或者指定的列连接两个DataFrame,通过一个list可以一次高效的连接多个DataFrame。

DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)

小结:
DataFrame的join默认为左连接
DataFrame的join连接时,caller的关键列默认为index,可以使用参数on指定别的列为关键列,但是other的关键列永远都是index,所有使用别的列为关键列是,常常使用set_index()

append

append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)

DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)

merge

pd.merge()函数可实现可实现三种数据连接:一对一、多对一和多对多。
一对一连接

df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],
                    'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],
                    'hire_date': [2004, 2008, 2012, 2014]})
display('df1', 'df2')
df3 = pd.merge(df1, df2)
df3

多对一连接

df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'],
                    'supervisor': ['Carly', 'Guido', 'Steve']})
display('df3', 'df4', 'pd.merge(df3, df4)')

多对多连接

df5 = pd.DataFrame({'group': ['Accounting', 'Accounting',
                              'Engineering', 'Engineering', 'HR', 'HR'],
                    'skills': ['math', 'spreadsheets', 'coding', 'linux',
                               'spreadsheets', 'organization']})
display('df1', 'df5', "pd.merge(df1, df5)")

实战部分:

#导入数据
import numpy as np
import pandas as pd
载入data文件中的:train-left-up.csv
df=pd.read_csv(r'.\data\train-left-up.csv')
df.head()

数据的合并

任务一:将data文件夹里面的所有数据都载入,观察数据的之间的关系

text_left_up = pd.read_csv("data/train-left-up.csv")
text_left_down = pd.read_csv("data/train-left-down.csv")
text_right_up = pd.read_csv("data/train-right-up.csv")
text_right_down = pd.read_csv("data/train-right-down.csv")

任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up

list_up = [text_left_up,text_right_up]
result_up = pd.concat(list_up,axis=1)
result_up.head()

任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result。

list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
result = pd.concat([result_up,result_down])
result.head()

任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务

resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()

任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务

result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True)
result_down = pd.merge(text_left_down,text_right_down,left_index=True,right_index=True)
result = resul_up.append(result_down)
result.head()

任务六:完成的数据保存为result.csv

result.to_csv('result.csv')

任务七:将我们的数据变为Series类型的数据

unit_result=text.stack().head(20)

groupby

groupby()用法:
根据DataFrame本身的某一列或多列内容进行分组聚合

若按某一列聚合,则新DataFrame将根据某一列的内容分为不同的维度进行拆解,同时将同一维度的再进行聚合。
若按某多列聚合,则新DataFrame将是多列之间维度的笛卡尔积,例如:”key1″列,有a和b两个维度,而”key2″有one和two两个维度,则按”key1″列和”key2″聚合之后,新DataFrame将有四个group;

注意:groupby默认是在axis=0上进行分组的,通过设置axis=1,也可以在其他任何轴上进行分组。
任务一:计算泰坦尼克号男性与女性的平均票价

df  = text['Fare'].groupby(text['Sex'])
means = df.mean()
means

任务二:统计泰坦尼克号中男女的存活人数

survived_sex = text['Survived'].groupby(text['Sex']).sum()
survived_sex.head()

任务三:计算客舱不同等级的存活人数

survived_pclass = text['Survived'].groupby(text['Pclass'])
survived_pclass.sum()

任务四:统计在不同等级的票中的不同年龄的船票花费的平均值

text.groupby(['Pclass','Age'])['Fare'].mean().head()

任务五:将任务二和任务三的数据合并

result = pd.merge(means,survived_sex,on='Sex')
result

任务六:得出不同年龄的总的存活人数,然后找出存活人数的最高的年龄,最后计算存活人数最高的存活率(存活人数/总人数)

#不同年龄的存活人数
survived_age = text['Survived'].groupby(text['Age']).sum()
survived_age.head()

#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]

_sum = text['Survived'].sum()
print(_sum)

#首先计算总人数
_sum = text['Survived'].sum()
print("sum of person:"+str(_sum))
precetn =survived_age.max()/_sum
print("最大存活率:"+str(precetn))

Original: https://blog.csdn.net/weixin_44964457/article/details/118863103
Author: 小新儿
Title: 第二章:02数据重构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678474/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球