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
col1 | col2 | |
---|---|---|
A | 1 | o |
A | 2 | o |
B | 3 | p |
B | 3 | q |
C | 4 | r |
D | 5 | NaN |