python对数据进⾏分组怎么实现_Python--DataFrame分组-
GroupBy
DataFame分组功能及其他配合使⽤⽅法
分组统计  GroupBy
#*.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False,observed=False,**kwargs)#a ⾏ / 1 列
有这样⼀组数据 :
df =pd.DataFrame({'key1':['a','a','b','b','a'],'key2':
['one','two','one','two','three'],'data1':np.random.randn(5),'data2':np.random.randn(5)
})#-------------------------------#
key1 key2 data1 data2
0 a one-0.205263 1.820120
1 a two 0.436864 -1.858459
2 b one 0.695624 1.134222
3 b two 0.281301 1.735320
4 a three 1.040519 0.657742
View Code
如何对 ‘key1’ 进⾏ 分组 并求 平均值 ?
ass = df['data1'].groupby(df['key1']) #这是⼀个分组对象,没有进⾏任何计算
#df.groupby('key1').mean()#df[['data1','data2']].groupby('key1').mean()
⽐较简单 ,呵 ,那么如何对多个'字段'进⾏分组 ? 要求对 key1 , key2进⾏分组并计算data2的平均值
df['data2'].groupby([df['key1'],df['key2']]).mean()#这种分组 只需要将需要的字段放⼊数组( 也是列表[] )中即可
#---------------------------#
key1 key2
a one1.820120three0.657742two-1.858459
b one1.134222two1.735320Name: data2, dtype: float64
View Code
有如下数据 :
city =Series(['北京','长沙','长沙','北京','北京'])
years= Series([2018,2018,2019,2018,2019])#---------------------------#
0 北京1长沙2长沙3北京4北京
dtype: object
02018
1 2018
2 2019
3 2018
4 2019dtype: int64
那么 , 如何⽤城市 和 年份对 df 进⾏分组呢?
df['data1'].groupby([city,years]).mean()#----------------------------#
北京 2018 -0.681558
2019 1.580496长沙2018 -0.112299
2019 -0.498441Name: data1, dtype: float64#分组的键可以是任何长度适当(=len(index))的数组#  这个就是将分组键改成了⾃定义城市和年份 匹配相同的相加求平均值 ,不匹配的不计算#北京的2018相加 求平均 北京2019 相加求平均 . 长沙的也⼀样
View Code
那⼜ 如何对整个 df 的 key1 分组求平均值?
#----------------------#
data1 data2
key1
a0.424040 0.206468b0.488462 1.434771
#----------------------#
data1 data2
key1 key2
a one-0.205263 1.820120three1.040519 0.657742two0.436864 -1.858459
b one0.695624 1.134222two0.281301
1.735320
View Code
如何求分组的 ⼤⼩ ,组数量, 分组的⾏数 ?
#-----------------#
key1 key2
a one1three1two1
b one1two1dtype: int64
对分组进⾏迭代 :groupby 对象⽀持迭代,可以产⽣⼀组 ⼆元元组,由 分组名 和 数据块组成。代码如下for df1 ,df2 upby(['key1']):print(df1)print(df2)#--------------------------#
a
key1 key2 data1 data2
0 a one-0.245438 -1.030687
1 a two -0.112299 1.817918
4 a three 1.580496 0.861224b
groupby分组key1 key2 data1 data22 b one -0.498441 -0.946496
3 b two -1.117678 0.129720
#  以key1中的数据分组,分出N元元组,名字是key1中的数据名称为分组名
# len(df[df['key1'].duplicated()==False]) df的key1列中数据不重复的长度 上⾯输出的是 2
还可以在多元分组的基础上再对 key2 分组 ,如何实现呢? 如下
for (k1,k2),group upby(['key1','key2']):print(k1,k2) #key1的值, key2的值
print(group) #key1的值+key2的值+后⾯的数据 同累型a one,a two,b one。。。这种
#------------------------#
a one
key1 key2 data1 data2
0 a one-0.245438 -1.030687a three
key1 key2 data1 data24 a three 1.580496 0.861224a two
key1 key2 data1 data21 a two -0.112299 1.817918b one
key1 key2 data1 data22 b one -0.498441 -0.946496b two
key1 key2 data1 data23 b two -1.117678 0.12972
View Code
如何将 groupby() 之后的对象做成⼀个字典呢?  dict()
dict([('a','b'),('c','d')])
将 df 按 key1 分组后的内容转换 :
ps = dict(upby(['key1']))) ## 把分组内容变成⼀个字典对象,通过健取值,如所有a,所有b print(ps)
ps['a'] #取出字典中 的所有 a 组#-----------------------#
{'a': key1 key2 data1 data2
0 a one-0.205263 1.820120
1 a two 0.436864 -1.858459
4 a three 1.040519 0.657742, 'b': key1 key2 data1 data22 b one 0.695624 1.134222 3 b two 0.281301 1.735320}
key1 key2 data1 data2
0 a one-0.205263 1.820120
1 a two 0.436864 -1.858459
4 a three 1.040519 0.657742
View Code
上⾯都是对 列 进⾏分组的, ‘⾏’ 可不可以呢? 怎么实现?
#按⾏的数据 , 对列进⾏分组 axis=1
line = df.groupby(df.dtypes,axis=1) #⾏ 按数据类型进⾏分组
dict(list(line))#--------------------#
{dtype('float64'): data1 data2
0-0.205263 1.820120
1 0.436864 -1.858459
2 0.695624 1.134222
3 0.281301 1.735320
4 1.040519 0.657742, dtype('O'): key1 key2
0 a one1a two2b one3b two4 a three}
View Code
按照 分组键 ,对整个对象进⾏分组
分组后有多列 , 那我如何选择其中的⼀列 或者多列 ,我如何得到 data1呢?
#⽤列名对 groupby 对象进⾏索引,就能实现选取部分进⾏聚合达到⽬的 有效的提⾼效率
#--------------------------------------#
key2
one0.490361three1.040519two0.718165Name: data1, dtype: float64
data1 data2
key2
——————————————
one0.490361 2.954342three1.040519 0.657742two0.718165 -0.123139
View Code
#  选取⼀组列的时候 ,⽤列表的⽅式,返回的是 DataFrame 对象
##df['data1'].groupby(df['key1']).mean() 等于df.groupby(['key1'])['data1'].mean()##
通过 字典 或者 Series 进⾏分组
df = DataFrame(np.random.randn(5,5),columns=list('abcde'),index=['长沙','北京','上海','杭州','深圳'])
df.loc[2:3,['b','c']] = np.NaN #添加⼏个NaN值
#假设已知列的分组关系,希望根据分组计算列的总和colors = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
dt = df.groupby(colors,axis=1)
dt.sum()#就是对columns 使⽤colors重命名 同名合并 ⾏的值 横向sum()
#------------------#
blue red
长沙0.994708 0.519499北京-1.212472 1.080747上海0.472694 0.258676杭州-2.339634 0.598021深圳-1.938784 1.777040
View Code
Series也有同样的功能 ,使⽤⽅法如下 :
ser =Series(colors)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。