10 pandas DataFrame - 表合并、堆叠、分组

=== 表合并 ===

场景:两个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)
img_3a21ee87ca8422814e20773c13af9116.png
如果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')
img_cc7f3561aae57b21936efb49197be4ae.png
合成一个索引
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
img_a0a7af36bf7d10bb5ab76061ae304198.png

如果学生没有考试,成绩为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
img_fa1344ed912d8308e808ebb3b4eac199.png
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()
img_8d83812a2fc9970f5fed5b6c28375180.png
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值