Pandas

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()
上一篇下一篇

猜你喜欢

热点阅读