数据合并
承接数据分析学习之数据规整(1):
**代码演示:**在实际我们可能会遇到语文老师手上有一个语文成绩表
数学老师有数学成绩表,英语老师有英语成绩表,综合老师有综合成绩表,
但是作为班主任,想要的是每一个学生的每一科成绩全部在一张表上,如下是代码示例
left2 = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]],
index=['a', 'c', 'e'],
columns=['语文', '数学'])
right2 = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]],
index=['b', 'c', 'd', 'e'],
columns=['英语', '综合'])
left2
语文 数学
a 1.0 2.0
c 3.0 4.0
e 5.0 6.0
right2
英语 综合
b 7.0 8.0
c 9.0 10.0
d 11.0 12.0
e 13.0 14.0
# 我们想要把两个表连接
# 分析 首先它们没有相同的列名 但是索引有相同的
# 所以第一种方法可以是按索引 然后连接方式是全连接 outer 才能把所有的情况都写进去
pd.merge(left2,right2,how='outer',left_index=True,right_index=True)
语文 数学 英语 综合
a 1.0 2.0 NaN NaN
b NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0
d NaN NaN 11.0 12.0
e 5.0 6.0 13.0 14.0
# 第二种方法
# 其要求是没有重复的列才可用
# 按索引合并,但是要求没有重叠的列
# 效果和上面的方法是一样的
left2.join(right2,how='outer')
语文 数学 英语 综合
a 1.0 2.0 NaN NaN
b NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0
d NaN NaN 11.0 12.0
e 5.0 6.0 13.0 14.0
pd.concat
用法与实践如下:
a2 = pd.Series([4,5,6],index=list('cde'))
a2
c 4
d 5
e 6
dtype: int64
a1 = pd.Series(np.arange(4),index=list('abcd'))
a1
a 0
b 1
c 2
d 3
dtype: int32
# 将两个series合并 并且变成了层级索引
s1 = pd.concat([a1,a2],keys=['data1','data2'])
s1
data1 a 0
b 1
c 2
d 3
data2 c 4
d 5
e 6
dtype: int64
# 我们可以通过stack unstack 进行dataframe和series的转换
s1.unstack()
a b c d e
data1 0.0 1.0 2.0 3.0 NaN
data2 NaN NaN 4.0 5.0 6.0
# 我们看到了里面有nan值如果我们不想要nan值得话
# 可以指定 fill_values进行nan值得填充
轴向旋转
这个方法可以应用在时间序列中,比如某一天有abc同时买了股票但是我得数据是这样得
我想要11-22号那一天得a买了多少b买了多少c买了多少,那这个方法就是比较有用且快速的,能够让数据更加的直观。
代码如下:
# index 是将data作为行索引 也就是层级索引的第一层
# columns 将class作为列索引 也就是层级索引的第二层
# values则是值 如果values不指定的话会把剩下的列全部当作values填充
df3.pivot(index = 'date',columns='class',values='values')
class a b c
date
2018-11-22 5.0 3.0 NaN
2018-11-23 NaN 2.0 6.0
2018-11-24 NaN NaN 1.0
关于什么是层级索引如果有不明白的可以翻看我的数据分析学习中有提到,如有理解错误请大佬指出。