pandas 连接学习

本文是DateWhale组队学习Pandas连接部分的学习心得。

方向连接之concat

在concat中,最常用的有三个参数,它们是axis, join, keys,分别表示拼接方向,连接形式,以及在新表中指示来自于哪一张旧表的名字。这里需要特别注意,join和keys与之前提到的join函数和键的概念没有任何关系。

在默认状态下的axis=0,表示纵向拼接多个表,常常用于多个样本的拼接;而axis=1表示横向拼接多个表,常用于多个字段或特征的拼接。
例如,纵向合并各表中人的信息:

df1 = pd.DataFrame({'Name':['San Zhang','Si Li'], 'Age':[20,30]})
df2 = pd.DataFrame({'Name':['Wu Wang'], 'Age':[40]})
pd.concat([df1, df2])
NameAge
0San Zhang20
1Si Li30
2Wu Wang40

横向合并各表中的字段:

df2 = pd.DataFrame({'Grade':[80, 90]})
df3 = pd.DataFrame({'Gender':['M', 'F']})
pd.concat([df1, df2, df3], 1)
NameAgeGradeGender
0San Zhang2080M
1Si Li3090F

虽然说concat是处理关系型合并的函数,但是它仍然是关于索引进行连接的。纵向拼接会根据列索引对其,默认状态下join=outer,表示保留所有的列,并将不存在的值设为缺失;join=inner,表示保留两个表都出现过的列。横向拼接则根据行索引对齐,join参数可以类似设置。

df2 = pd.DataFrame({'Name':['Wu Wang'], 'Gender':['M']})
pd.concat([df1, df2])
NameAgeGender
0San Zhang20NaN
1Si Li30NaN
2Wu WangNaNM
df2 = pd.DataFrame({'Grade':[80, 90]}, index=[1, 2])
pd.concat([df1, df2], 1)
NameAgeGrade
0San Zhang20.0NaN
1Si Li30.080.0
2NaNNaN90.0
pd.concat([df1, df2], axis=1, join='inner')
NameAgeGrade
1Si Li30.080.0

因此,当确认要使用多表直接的方向合并时,尤其是横向的合并,可以先用reset_index方法恢复默认整数索引再进行合并,防止出现由索引的误对齐和重复索引的笛卡尔积带来的错误结果。

练习

Ex1美国疫情数据集

现有美国4月12日至11月16日的疫情报表,请将New York的Confirmed, Deaths, Recovered, Active合并为一张表,索引为按如下方法生成的日期字符串序列:

date = pd.date_range('20200412', '20201116').to_series()
date = date.dt.month.astype('string').str.zfill(2) +'-'+ date.dt.day.astype('string').str.zfill(2) +'-'+ '2020'
date = date.tolist()
date[:5]
['04-12-2020', '04-13-2020', '04-14-2020', '04-15-2020', '04-16-2020']

首先查看4月12日的报表数据。

df = pd.read_csv(f'../data/us_report/{date[0]}.csv')
df

在这里插入图片描述
每一张报表数据都是这种形式。
然后将Province_State(New York包含在其中)设置为索引。

df = df.set_index('Province_State')
df

在这里插入图片描述
查看4月12日的New York的Confirmed, Deaths, Recovered, Active

df.loc[['New York'],['Confirmed', 'Deaths', 'Recovered', 'Active']]

在这里插入图片描述
我们要做的其实就是将每一张报表数据转化成上述所示的DataFrame,然后在将所有的DataFrame进行合并(纵向拼接)。

采用pd.concat函数实现

def get_df(dt):
    data = pd.read_csv(f'../data/us_report/{dt}.csv')
    data = data.set_index('Province_State')
    return data.loc[['New York'],['Confirmed', 'Deaths', 'Recovered', 'Active']]
df = pd.concat([get_df(dt) for dt in date])
df['Date'] = date
df = df.reset_index()
df = df.set_index(['Province_State','Date'])
df

在这里插入图片描述

当你开始学习pandas时,以下是一个简单的学习路线: 1. 学习Python基础知识:在使用pandas之前,建议先掌握Python的基本语法和数据结构,例如列表、字典和函数等。 2. 安装pandas库:使用pip或conda等工具安装pandas库,并确保安装正确。 3. 学习pandas的数据结构:pandas主要提供了两种数据结构,即Series和DataFrame。了解它们的特点、创建方式和基本操作方法。 4. 数据导入与导出:学习如何从不同的数据源(如CSV、Excel、数据库等)中导入数据到pandas的DataFrame中,并将处理后的数据导出。 5. 数据清洗与预处理:学习如何处理缺失值、重复值、异常值等数据清洗操作,并进行数据类型转换、重命名列名等预处理操作。 6. 数据选择与过滤:学习如何使用pandas提供的方法选择和过滤DataFrame中的数据,包括使用标签、位置、条件等进行选择。 7. 数据排序与排名:学习如何对DataFrame中的数据进行排序和排名操作,以便更好地理解和分析数据。 8. 数据聚合与分组:学习如何使用pandas进行数据聚合和分组操作,包括使用聚合函数、分组键等进行数据分析。 9. 数据合并与连接:学习如何使用pandas进行多个DataFrame的合并和连接操作,以便进行更复杂的数据分析和处理。 10. 数据可视化:学习如何使用pandas结合matplotlib或其他可视化库进行数据可视化,以便更直观地展示和分析数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值