数据分析(4)数据的合并和分组聚合

本文详细介绍了Python中pandas库的字符串离散化、数据合并(join与merge操作)、分组与聚合,包括如何按国家/省份进行统计,以及数据索引和复合索引的使用。涵盖了核心的Pandas技巧和数据操作流程。
摘要由CSDN通过智能技术生成

01字符串离散化的案例

在这里插入图片描述

02数据合并

join

join: 默认情况下他是把行索引相同的数据合并到一起

>>> import numpy as np
>>> import pandas as pd
>>> t1 = pd.DataFrame(np.ones((3,4)),index = list("ABC"))
>>> t1
     0    1    2    3
A  1.0  1.0  1.0  1.0
B  1.0  1.0  1.0  1.0
C  1.0  1.0  1.0  1.0
>>> t2  =pd.DataFrame(np.zeros((2,5)),index=list("AB"),columns=list("VWXYZ"))
>>> t2
     V    W    X    Y    Z
A  0.0  0.0  0.0  0.0  0.0
B  0.0  0.0  0.0  0.0  0.0
>>> t1.join(t2)	#以t1为主
     0    1    2    3    V    W    X    Y    Z
A  1.0  1.0  1.0  1.0  0.0  0.0  0.0  0.0  0.0
B  1.0  1.0  1.0  1.0  0.0  0.0  0.0  0.0  0.0
C  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN
>>> t2.join(t1)		#以t2为主
     V    W    X    Y    Z    0    1    2    3
A  0.0  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
B  0.0  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0

merge

merge: 按照指定的把数据按照一定的方式合并到一起
在这里插入图片描述
默认的合并方式inner,交集
merge outer,并 集,NaN补全
merge left,左边为准,NaN补全
merge right,右边为准,NaN补全

03数据分组聚合

分组和聚合
在pandas中分组的操作:grouped = df.groupby(by=“columns_name”)
grouped是一个DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组
元组里面是(索引(分组的值),分组之后的DataFrame)
在这里插入图片描述
如果我们需要对国家和省份进行分组统计,应该怎么操作呢?
grouped = df.groupby(by=[df[“Country”],df[“State/Province”]])
很多时候我们只希望对获取分组之后的某一部分数据,或者说我们只希望对某几列数据进行分组,这个时候我们应该怎么办呢?
获取分组之后的某一部分数据:
df.groupby(by=[“Country”,“State/Province”])[“Country”].count()
对某几列数据进行分组:
df[“Country”].groupby(by=[df[“Country”],df[“State/Province”]]).count()

观察结果,由于只选择了一列数据,所以结果是一个Series类型
如果我想返回一个DataFrame类型呢?
t1 = df[[“Country”]].groupby(by=[df[“Country”],df[“State/Province”]]).count()
t2 = df.groupby(by=[“Country”,“State/Province”])[[“Country”]].count()

以上的两条命令结果一样
和之前的结果的区别在于当前返回的是一个DataFrame类型

04数据的索引

简单的索引操作:
获取index: df.index
指定index : df.index = [‘x’,‘y’]
重新设置index : df.reindex(list(“abcedf”)) #实则是对dataframe进行取行
指定某一列作为index : df.set_index(“Country”,drop=False)
返回index的唯一值: df.set_index(“Country”).index.unique() #drop为假表示之前列充当索引的列名称依然保存

>>> import numpy as np
>>> t = pd.DataFrame(np.ones((3,4)),index = list("ABC"))
>>> t
     0    1    2    3
A  1.0  1.0  1.0  1.0
B  1.0  1.0  1.0  1.0
C  1.0  1.0  1.0  1.0
>>> t.index
Index(['A', 'B', 'C'], dtype='object')
>>> t.set_index(0)
       1    2    3
0                 
1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0
>>> t.set_index(0,drop=False)
       0    1    2    3
0                      
1.0  1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0  1.0
>>> t1=t.set_index(0,drop=False)
>>> t1
       0    1    2    3
0                      
1.0  1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0  1.0
1.0  1.0  1.0  1.0  1.0
>>> t1[0][1.0]=100
>>> t1
           0    1    2    3
0                          
100.0  100.0  1.0  1.0  1.0
100.0  100.0  1.0  1.0  1.0
100.0  100.0  1.0  1.0  1.0
>>> t1[1].unique()
array([1.])
>>> t1[0].unique()
array([100.])

Series复合索引

假设a为一个DataFrame,那么当a.set_index([“c”,“d”])即设置两个索引的时候是什么样子的结果呢?
Series的复合索引取值,直接在括号中写索引就可以了

>>> a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c': ['one','one','one','two','two','two', 'two'],'d': list("hjklmno")})
>>> a
   a  b    c  d
0  0  7  one  h
1  1  6  one  j
2  2  5  one  k
3  3  4  two  l
4  4  3  two  m
5  5  2  two  n
6  6  1  two  o
>>> b= a.set_index(['c','d'])
>>> b
       a  b
c   d      
one h  0  7
    j  1  6
    k  2  5
two l  3  4
    m  4  3
    n  5  2
    o  6  1
c = b["a"]
>>> c
c    d
one  h    0
     j    1
     k    2
two  l    3
     m    4
     n    5
     o    6
Name: a, dtype: int64
>>> type(c)
<class 'pandas.core.series.Series'>
>>> c["one"]['j']
1
>>> c['one']
d
h    0
j    1
k    2
Name: a, dtype: int64

swaplevel() level相当于复合索引的里外层,交换了level之后,里外交换

>>> c.swaplevel()
d  c  
h  one    0
j  one    1
k  one    2
l  two    3
m  two    4
n  two    5
o  two    6
Name: a, dtype: int64
>>> c.swaplevel()['h']
c
one    0
Name: a, dtype: int64

DataFrame复合索引

>>> d= a.set_index(['d','c'])
>>> d
       a  b
d c        
h one  0  7
j one  1  6
k one  2  5
l two  3  4
m two  4  3
n two  5  2
o two  6  1
>>> d.index
MultiIndex([('h', 'one'),
            ('j', 'one'),
            ('k', 'one'),
            ('l', 'two'),
            ('m', 'two'),
            ('n', 'two'),
            ('o', 'two')],
           names=['d', 'c'])
>>> d.index.levels
FrozenList([['h', 'j', 'k', 'l', 'm', 'n', 'o'], ['one', 'two']])
>>> d.swaplevel()
       a  b
c   d      
one h  0  7
    j  1  6
    k  2  5
two l  3  4
    m  4  3
    n  5  2
    o  6  1
>>> d.swaplevel().loc['one']
   a  b
d      
h  0  7
j  1  6
k  2  5
>>> b
       a  b
c   d      
one h  0  7
    j  1  6
    k  2  5
two l  3  4
    m  4  3
    n  5  2
    o  6  1
>>> b.loc['one'].loc['h']
a    0
b    7
Name: h, dtype: int64
>>> b.swaplevel().loc['h']
     a  b
c        
one  0  7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值