python下用pandas实现数据统计--groupby分组
1、groupby广泛用在数据统计之中,可以实现很多数据库函数的功能。
本文仅从单列分组,两列分组 , 求和 求平均 和 describe 时间分组还有筛选 ,六个方面例子进行说明。
数据初始化代码:
import pandas as pd
import numpy as np
import os
import sys
exampleData = {'电源': ['220v', '110v', '28v', '5v', '3v'],
'电阻': ['100', '100', '100', '1M', '2.2K'],
'厂家': ['A厂', 'B厂', 'A厂', 'B厂', 'C厂' ],
'数量': [5, 20, 14, 15, 20]}
df = pd.DataFrame(exampleData)
print(df)


2、#按厂家分组,并统计个数
print("------数据分组统计个数-----")
groupnum = df.groupby(['厂家']).size()
print(groupnum)
#打印每组数据 这个很有用
print("------数据分组-----")
for groupname,grouplist in df.groupby('厂家'):
print(groupname)
print(grouplist)

3、# 求平均#将数量转换成浮点型,然后分组求均值print("------数据分组求平均-----")groupmean = df['数量'].astype(float).groupby(df['厂家']).mean()print(groupmean, type(groupmean))# 求和#将数量转换成浮点型,然后分组求和print("------数据分组求和-----")groupsum = df['数量'].astype(float).groupby(df['厂家']).sum()print(groupsum, type(groupsum))

4、#追加列
print("------追加列-----")
df['地点'] = ['上海','北京',"大陆",'台湾','广州']
df['日期'] = ['2019-03-11','2019-03-16',"2019-03-16",'2019-03-16','2019-03-15']
print(df)
print("------多 列 数据分组统计个数-----")
groupnum = df.groupby(['厂家','电阻']).size()
print(groupnum)

5、# 按厂家与电阻分组,求数量这一列均值
print("------按厂家与电阻分组,求数量这一列均值--")
groupmean = df['数量'].astype(float).groupby([df['厂家'],df['电阻']]).mean()
print(groupmean)
# 按厂家与电阻分组,求数量这一列sum
print("------按厂家与电阻分组,求数量这一列sum--")
groupsum = df['数量'].astype(float).groupby([df['厂家'],df['电阻']]).sum()
print(groupsum)
print("------按厂家与电阻分组,求数量这一列describe--")
groupdescribe = df['数量'].astype(float).groupby([df['厂家'],df['电阻']]).describe()
print(groupdescribe)

6、print("------按厂家 分组,日期这一列count--")
# 转化为时间格式
df["新日期"] = pd.to_datetime(df["日期"],format ="%Y-%m-%d")
print(df)
groupcount = df.groupby([df['新日期']]).count()
print(groupcount)
groupnum = df.groupby(['新日期']).size()
print(groupnum)
# 按照年分组
print(df.groupby(df["新日期"].apply(lambda i:i.year)).count())

7、# 到这里是按月分组
new_df = df.groupby(df["新日期"].apply(lambda i:i.day),as_index=False)
print(new_df)
print("------数据分组-----")
for groupname,grouplist in new_df:
print(groupname)
print(grouplist)
#打印按天 并且筛选数据只有一个的
newdf = df.groupby(df["新日期"].apply(lambda i:i.day),as_index=False).filter(lambda i: len(i)==1)
print(newdf)
#打印按天 并且筛选数据大于一个的
newdf = df.groupby(df["新日期"].apply(lambda i:i.day),as_index=False).filter(lambda i: len(i) > 1)
print(newdf)
