Pandas练习题 (五)

该博客展示了如何处理美国疫情数据,将NewYork州的Confirmed, Deaths, Recovered, Active病例数合并到一张表中,使用日期作为索引。同时,定义了一个自定义的join函数,支持left, right和outer连接方式,处理无公共列的两个数据框的合并,确保所有可能的组合都被考虑,并在缺失值时填充NaN。
摘要由CSDN通过智能技术生成

Ex1:美国疫情数据集

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

import numpy as np
import pandas as pd

date = pd.date_range('20200412', '20201116').to_series()
# print(date)
date = date.dt.month.astype('string').str.zfill(2) +'-'+ date.dt.day.astype('string').str.zfill(2) +'-'+ '2020'
# print(date)
date = date.tolist()
# print(date)
L = []
for d in date:
    df = pd.read_csv('../data/us_report/' + d + '.csv', index_col='Province_State')
    data = df.loc['New York', ['Confirmed','Deaths','Recovered','Active']]
    L.append(data.to_frame().T)
res = pd.concat(L)#L是个列表,L里存放着的是DataFrame类型的元素。要把所有的DataFrame转换为一个DageFrame元素。
res.index = date
res.head()

Ex2:实现join函数

请实现带有how参数的join函数
假设连接的两表无公共列
调用方式为 join(df1, df2, how=“left”)
给出测试样例

df1 = pd.DataFrame({'col1':[1,2,3,4,5]}, index=list('AABCD'))
df2 = pd.DataFrame({'col2':list('opqrst')}, index=list('ABBCEE'))
def join(df1, df2, how='left'):
    res_col = df1.columns.tolist() +  df2.columns.tolist()# 把全部的行索引都取得
    dup = df1.index.unique().intersection(df2.index.unique())# 列索引的交集
    res_df = pd.DataFrame(columns = res_col)
    for label in dup:# 一列列的执行操作
        
        cartesian = [list(i)+list(j) for i in df1.loc[label].values.reshape(-1,1) for j in df2.loc[label].values.reshape(-1,1)]#把具有相同索引的列结合,如果有多个,则笛卡尔
        dup_df = pd.DataFrame(cartesian, index = [label]*len(cartesian), columns = res_col)# 转变成新的DataFrame的格式
        res_df = pd.concat([res_df,dup_df])#加到旧的里面
    if how in ['left', 'outer']:
        # 分情况构建带有nan的DataFrame
        for label in df1.index.unique().difference(dup):# 差集
            if isinstance(df1.loc[label], pd.DataFrame):# 
                cat = [list(i)+[np.nan]*df2.shape[1] for i in df1.loc[label].values]#有多行的相同值  本例子中 多个DDD
            else:
                cat = [list(i)+[np.nan]*df2.shape[1] for i in df1.loc[label].to_frame().values]#语法上没问题,但是为了执行加法[5]与[[5]]的区别。
            dup_df = pd.DataFrame(cat, index = [label]*len(cat), columns = res_col)#这样子写可以把一个索引多个行构建
            print(dup_df)
            res_df = pd.concat([res_df,dup_df])
    if how in ['right', 'outer']:
        for label in df2.index.unique().difference(dup):
            if isinstance(df2.loc[label], pd.DataFrame):
                cat = [[np.nan]+list(i)*df1.shape[1] for i in df2.loc[label].values]
            else:
                cat = [[np.nan]+list(i)*df1.shape[1] for i in df2.loc[label].to_frame().values]
            dup_df = pd.DataFrame(cat, index = [label]*len(cat), columns = res_col)
            res_df = pd.concat([res_df,dup_df])
    return res_df
join(df1, df2, how='left')
[5]
[[5]]
   col1  col2
D     5   NaN
col1col2
A1o
A2o
B3p
B3q
C4r
D5NaN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值