2020.04.30 Pandas合并

本文通过实战案例,展示了如何处理复杂的数据集,包括合并、筛选、填充缺失值等操作,特别聚焦于处理公司员工信息及课程分数数据,提供了解决方案以应对数据处理中的常见挑战。

1.5.2 2. 练习
1.5.2.1 【练习一】有2张公司的员工信息表,每个公司共有16名员工,共有五个公司,请解决如下问题:
pd.read_csv(‘data/Employee1.csv’).head()
Company Name Age Height Weight Salary
0 A a1 47 188 63.7 25819
1 A a3 39 172 55.9 21983
2 A a4 43 158 62.5 21755
3 A a6 42 182 76.9 17354
4 A a7 49 171 94.6 6177
pd.read_csv(‘data/Employee2.csv’).head()
Company Name Age Height Weight Salary
0 A a1 30 156 91.2 28133
1 A a2 50 190 83.4 6673
2 A a3 34 168 96.6 16503
3 A a5 51 176 97.2 23294
4 A a6 37 183 93.2 19256
1.5.2.2 (a) 每个公司有多少员工满足如下条件:既出现第一张表,又出现在第二张表。
1.5.2.3 (b) 将所有不符合(a)中条件的行筛选出来,合并为一张新表,列名与原表一致。
1.5.2.4 © 现在需要编制所有80位员工的信息表,对于(b)中的员工要求不变,对于满足(a)条件员工,它们在某个指标的数值,取偏离它所属公司中满足(b)员工的均值数较小的哪一个,例如:P公司在两张表的交集为{p1},并集扣除交集为{p2,p3,p4},那么如果后者集合的工资均值为1万元,且p1在表1的工资为13000元,在表2的工资为9000元,那么应该最后取9000元作为p1的工资,最后对于没有信息的员工,利用缺失值填充。
1.5.2.5 【练习二】有2张课程的分数表(分数随机生成),但专业课(学科基础课、专业必修课、专业选修课)与其他课程混在一起,请解决如下问题:
pd.read_csv(‘data/Course1.csv’).head()
课程名字 课程类别 学分 分数
0 思想道德修养与法律基础 思政类 3 89.0
1 云计算应用与开发 专业选修课 3 96.0
2 社会计算 专业选修课 3 78.0
3 深度学习 专业选修课 3 75.0
4 人工智能导论 专业必修课 3 84.0
pd.read_csv(‘data/Course2.csv’).head()
课程名字 课程类别 学分 分数
0 高等数学(一) 学科基础课 4 99.0
1 数据科学与工程导论 学科基础课 3 NaN
2 专业英语 学科基础课 2 100.0
3 概率论 学科基础课 3 99.0
4 计算机系统 专业必修课 4 80.0
1.5.2.6 (a) 将两张表分别拆分为专业课与非专业课(结果为四张表)。
1.5.2.7 (b) 将两张专业课的分数表和两张非专业课的分数表分别合并。
1.5.2.8 © 不使用(a)中的步骤,请直接读取两张表合并后拆分。
1.5.2.9 (d) 专业课程中有缺失值吗,如果有的话请在完成(3)的同时,用组内(3种类型的专业课)均值填充缺失值后拆分。

1.9 第5章:练习一
1.9.1 (a)
df1 = pd.read_csv(‘data/Employee1.csv’)
df2 = pd.read_csv(‘data/Employee2.csv’)
df1.head()
Company Name Age Height Weight Salary
0 A a1 47 188 63.7 25819
1 A a3 39 172 55.9 21983
2 A a4 43 158 62.5 21755
3 A a6 42 182 76.9 17354
4 A a7 49 171 94.6 6177
df2.head()
Company Name Age Height Weight Salary
0 A a1 30 156 91.2 28133
1 A a2 50 190 83.4 6673
2 A a3 34 168 96.6 16503
3 A a5 51 176 97.2 23294
4 A a6 37 183 93.2 19256
L = list(set(df1[‘Name’]).intersection(set(df2[‘Name’])))
L
[‘e11’,
‘c13’,
‘a3’,
‘b7’,
‘e8’,
‘b3’,
‘d5’,
‘b15’,
‘a6’,
‘e10’,
‘c3’,
‘c10’,
‘c12’,
‘d10’,
‘b1’,
‘a1’]
1.9.2 (b)
df_b1 = df1[~df1[‘Name’].isin(L)]
df_b2 = df2[~df2[‘Name’].isin(L)]
df_b = pd.concat([df_b1,df_b2]).set_index(‘Name’)
df_b.head()
Company Age Height Weight Salary
Name
a4 A 43 158 62.5 21755
a7 A 49 171 94.6 6177
a8 A 51 168 89.5 3246
a9 A 36 186 62.8 3569
a13 A 58 190 75.9 21854
1.9.3 ©
df1 = pd.read_csv(‘data/Employee1.csv’)
df2 = pd.read_csv(‘data/Employee2.csv’)
df1[‘重复’] = [‘Y_1’ if df1.loc[i,‘Name’] in L else ‘N’ for i in range(df1.shape[0])]
df2[‘重复’] = [‘Y_2’ if df2.loc[i,‘Name’] in L else ‘N’ for i in range(df2.shape[0])]
df1 = df1.set_index([‘Name’,‘重复’])
df2 = df2.set_index([‘Name’,‘重复’])
df_c = pd.concat([df1,df2])
result = pd.DataFrame({‘Company’:[],‘Name’:[],‘Age’:[],‘Height’:[],‘Weight’:[],‘Salary’:[]})
group = df_c.groupby([‘Company’,‘重复’])
for i in L:
first = group.get_group((i[0].upper(),‘Y_1’)).reset_index(level=1).loc[i,:][-4:]
second = group.get_group((i[0].upper(),‘Y_2’)).reset_index(level=1).loc[i,:][-4:]
mean = group.get_group((i[0].upper(),‘N’)).reset_index(level=1).mean()
final = [i[0].upper(),i]
for j in range(4):
final.append(first[j] if abs(first[j]-mean[j])<abs(second[j]-mean[j]) else second[j])
result = pd.concat([result,pd.DataFrame({result.columns.tolist()[k]:[final[k]] for k in range(6)})])
result = pd.concat([result.set_index(‘Name’),df_b])
for i in list(‘abcde’):
for j in range(1,17):
item = i+str(j)
if item not in result.index:
result = pd.concat([result,pd.DataFrame({‘Company’:[i.upper()],‘Name’:[item]
,‘Age’:[np.nan],‘Height’:[np.nan],‘Weight’:[np.nan],‘Salary’:[np.nan]}).set_index(‘Name’)])
result[‘Number’] = [int(i[1:]) for i in result.index]
result.reset_index().drop(columns=‘Name’).set_index([‘Company’,‘Number’]).sort_index()
Age Height Weight Salary
Company Number
A 1 47.0 188.0 91.2 25819.0
2 50.0 190.0 83.4 6673.0
3 39.0 172.0 96.6 16503.0
4 43.0 158.0 62.5 21755.0
5 51.0 176.0 97.2 23294.0
… … … … … …
E 12 54.0 157.0 79.4 18490.0
13 57.0 180.0 54.8 26837.0
14 39.0 163.0 83.0 20554.0
15 NaN NaN NaN NaN
16 NaN NaN NaN NaN
80 rows × 4 columns

1.10 第5章:练习二
1.10.1 (a)
df1 = pd.read_csv(‘data/Course1.csv’)
df2 = pd.read_csv(‘data/Course2.csv’)
df_a11,df_a12,df_a21,df_a22 =0,0,0,0
df_a11= df1.query(‘课程类别 in [“学科基础课”,“专业必修课”,“专业选修课”]’)
df_a12= df1.query(‘课程类别 not in [“学科基础课”,“专业必修课”,“专业选修课”]’)
df_a21= df2.query(‘课程类别 in [“学科基础课”,“专业必修课”,“专业选修课”]’)
df_a22= df2.query(‘课程类别 not in [“学科基础课”,“专业必修课”,“专业选修课”]’)
df_a11.head()
课程名字 课程类别 学分 分数
1 云计算应用与开发 专业选修课 3 96.0
2 社会计算 专业选修课 3 78.0
3 深度学习 专业选修课 3 75.0
4 人工智能导论 专业必修课 3 84.0
6 数据结构与算法 学科基础课 5 82.0
1.10.2 (b)
special = pd.concat([df_a11,df_a21])
common = pd.concat([df_a12,df_a22])
special.query(‘课程类别 not in [“学科基础课”,“专业必修课”,“专业选修课”]’)
课程名字 课程类别 学分 分数
common.query(‘课程类别 in [“学科基础课”,“专业必修课”,“专业选修课”]’)
课程名字 课程类别 学分 分数
1.10.3 ©
df = pd.concat([df1,df2])
special2 = df.query(‘课程类别 in [“学科基础课”,“专业必修课”,“专业选修课”]’)
common2 = df.query(‘课程类别 not in [“学科基础课”,“专业必修课”,“专业选修课”]’)
(special.equals(special2),common.equals(common2))
(True, True)
1.10.4 (d)
df[‘分数’] = df.groupby(‘课程类别’).transform(lambda x: x.fillna(x.mean()))[‘分数’]
df.isnull().all()
课程名字 False
课程类别 False
学分 False
分数 False
dtype: bool
special3 = df.query(‘课程类别 in [“学科基础课”,“专业必修课”,“专业选修课”]’)
common3 = df.query(‘课程类别 not in [“学科基础课”,“专业必修课”,“专业选修课”]’)
common3.head()
课程名字 课程类别 学分 分数
0 思想道德修养与法律基础 思政类 3 89.0
5 中国近代史纲要 思政类 3 97.0
8 网球(初) 体育类 1 81.0
10 极端性气候与陆地生态系统 公共任意选修类 2 78.0
13 游泳(初) 体育类 1 75.0

`pandas.merge_asof()` 是 pandas中的一个函数,可以根据两个 dataframes 中的时间戳列,基于最接近的时间戳将两个 dataframes 进行合并。这个函数的作用类似于 SQL 中的 `JOIN` 操作,但是可以处理时间戳列,因此非常适用于金融数据等时间序列数据的合并。 具体来说,`merge_asof()` 函数的原理是将第一个 dataframe 中的每个时间戳与第二个 dataframe 中的时间戳进行比较,然后找到最接近的时间戳,并将这两个时间戳所对应的行合并成一行。这个函数的关键参数是 `on`,它指定了时间戳列的名称。 下面是一个例子,假设有两个 dataframes,df1 和 df2,它们都有一个时间戳列 date,现在要将它们合并成一个 dataframe: ```python import pandas as pd # 创建两个 dataframe df1 = pd.DataFrame({'date': pd.date_range('2020-01-01', periods=5, freq='T'), 'value': [1, 2, 3, 4, 5]}) df2 = pd.DataFrame({'date': pd.date_range('2020-01-01 00:02:30', periods=5, freq='T'), 'value': [10, 20, 30, 40, 50]}) # 使用 merge_asof() 合并两个 dataframe merged = pd.merge_asof(df1, df2, on='date') print(merged) ``` 运行结果如下: ``` date value_x value_y 0 2020-01-01 00:00:00 1 NaN 1 2020-01-01 00:01:00 2 NaN 2 2020-01-01 00:02:00 3 10.0 3 2020-01-01 00:03:00 4 20.0 4 2020-01-01 00:04:00 5 30.0 ``` 可以看到,合并后的 dataframe 中包含了两个 value 列,分别来自 df1 和 df2。其中,value_x 列来自 df1,value_y 列来自 df2。可以看到,在第一个时间戳 '2020-01-01 00:00:00' 和第二个时间戳 '2020-01-01 00:01:00' 处,df2 中并没有对应的时间戳,因此 value_y 列中对应的值为 NaN。在第三个时间戳处,df1 和 df2 中的时间戳都有,因此将它们合并到了一行中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值