10 pandas DataFrame - 表合并、堆叠、分组
2018-09-17 本文已影响66人
白尔摩斯
=== 表合并 ===
场景:两个dataFrame,一个是学生的[学号,姓名,班级] [学号,成绩] ,通过学号将两组信息合并到一起
print('\n---- 学生信息 ---')
students = pd.read_csv('stu_data.csv',encoding='gb2312')
print(students)
print('\n---- 学生成绩信息 ---')
scores = pd.read_csv('score_data.csv',encoding='gb2312')
print(scores)
原数据:
---- 学生信息 ---
学号 姓名 性别 年龄
0 1 Tom M 15
1 2 Wang F 17
2 3 Qin M 16
---- 学生成绩信息 ---
学号 课程 分数
0 1 语文 82
1 1 数学 92
2 1 英语 68
3 2 语文 75
4 2 数学 88
5 2 英语 54
6 3 语文 90
7 3 数学 95
8 3 英语 89
合成两张表
因为两张表里都有一个学号字段,所以会默认拿学号作合并
pd.merge(students,scores)
如果stu_data中的学号改为学号1,score_data中的学号改为学号2
直接合并会报错,没有公共的列无法合并
使用 left_on='学号1',right_on='学号2' 进行合并
students = pd.read_csv('stu_data.csv',encoding='gb2312')
scores = pd.read_csv('score_data.csv',encoding='gb2312')
pd.merge(students,scores,left_on='学号1',right_on='学号2')
合成一个索引
print('\n---- 学生信息 ---')
students=pd.read_csv('stu_data.csv',encoding='gb2312',index_col=0)
print(students)
print('\n---- 学生成绩信息 ---')
scores=pd.read_csv('score_data.csv',encoding='gb2312',index_col=0)
print(scores)
将students和scores的索引都设置为学号 index_col=0
merger的时候left_index=True,right_index=True 就可以找到连接的索引了
stu_scores=pd.merge(students,scores,left_index=True,right_index=True)
stu_scores
如果学生没有考试,成绩为NaN,会连接不到,使用how='outer'即可列出这些数据
how: outer并集,inner交集,left以左边为基础, right以右表为基础
stu_scores=pd.merge(students,scores,left_index=True,right_index=True,how='outer')
=== 堆叠 ===
场景:两组数据横向、纵向合并到一起
df1 = pd.DataFrame({'key':['a','a','b','b'],'data1':range(4)})
print(df1)
df2 = pd.DataFrame({'key':['b','b','c','c'],'data2':range(4)})
print(df2)
print(pd.concat([df1,df2],axis=1))
print(pd.concat([df1,df2],axis=0,join='outer'))
data1 key
0 0 a
1 1 a
2 2 b
3 3 b
data2 key
0 0 b
1 1 b
2 2 c
3 3 c
data1 key data2 key
0 0 a 0 b
1 1 a 1 b
2 2 b 2 c
3 3 b 3 c
data1 data2 key
0 0.0 NaN a
1 1.0 NaN a
2 2.0 NaN b
3 3.0 NaN b
0 NaN 0.0 b
1 NaN 1.0 b
2 NaN 2.0 c
3 NaN 3.0 c
=== 分组 ===
原数据:
data = pd.DataFrame({
'data1':np.random.randint(1,9,5),
'data2':np.random.randint(1,9,5),
'key1':list('aabba'),
'key2':['one','one','two','one','two']
})
data
1、对列进行分组 groupby
datas = data.groupby('key1')
datas
获得了一个对象
<pandas.core.groupby.DataFrameGroupBy object at 0x0000021BF73012E8>
2、查看分组对象
分成了两个个元组,将相同key1的一组分到一起
for i in datas:
print(i)
('a', data1 data2 key1 key2
0 7 4 a one
1 3 5 a one
4 5 4 a two)
('b', data1 data2 key1 key2
2 4 5 b two
3 3 3 b one)
3、通过key1进行分组,分别进行聚合操作
datas.mean()
datas.sum()
datas.min()
datas.max()