基于Python的数据聚合和分组运算

  • 对数据集进行分组并对各组应用一个函数(聚合或者转换),这是数据分析工作的一个重要环节
  • 数据集准备好后,通常任务就是计算分组统计生成透视表
import pandas as pd
from pandas import DataFrame,Series
import numpy as np

1、根据一个或多个键拆分pandas对象

pandasgroupby可以对数据集进行切片、切块、摘要

df=DataFrame({'key1':['a','a','b','b','a'],
            'key2':['one','two','one','two','one'],
            'data1':np.random.randn(5),
            'data2':np.random.randn(5)})

访问data1,并根据key1调用groupby

grouped = df['data1'].groupby(df['key1'])
grouped

返回一个groupby对象,它并没有进行任何计算,但该对象已经有了接下来对各分组执行运算所需的一切信息

grouped.mean()
## 返回一个含有分组大小的Series
df.groupby(['key1','key2']).size()
  • 对分组进行迭代,可以产生一组二元元组(有分组名和数据块组成)
for name,group in df.groupby('key1'):
    print (name)
    print (group)
Out:
a
  key1 key2     data1     data2
0    a  one -0.315867 -2.518720
1    a  two -0.510433  1.062739
4    a  one -0.432449  0.320446
b
  key1 key2     data1     data2
2    b  one -1.382297 -0.034554
3    b  two  2.742859  0.399418

for (k1,k2), group in df.groupby(['key1','key2']):
    print(k1,k2)
    print(group)
Out:
a one
  key1 key2     data1     data2
0    a  one -0.315867 -2.518720
4    a  one -0.432449  0.320446
a two
  key1 key2     data1     data2
1    a  two -0.510433  1.062739
b one
  key1 key2     data1     data2
2    b  one -1.382297 -0.034554
b two
  key1 key2     data1     data2
3    b  two  2.742859  0.399418
  • 选取一个或多个列
df.groupby(['key1','key2'])['data2'].mean()

得到Dataframe形式的结果

df.groupby(['key1','key2'])[['data2']].mean()
  • 通过字典或Series进行分组
people = DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],index=['joe','steve','wes','jim','travis'])
people.loc[2:3,['b','c']]=np.nan

## 字典
mapping={'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
by_column = people.groupby(mapping,axis=1)
by_column.sum()

## series
map_series = Series(mapping)
people.groupby(map_series,axis=1).sum()
  • 通过函数进行分组

通过人名的长度进行分组,只需要传入len函数

people.groupby(len).sum()
  • 根据索引级别分组
columnss = pd.MultiIndex.from_arrays([['us','us','us','jp','jp'],[1,3,5,1,3]],names=['cty','tenor'])
hier_df = DataFrame(np.random.randn(4,5),columns=columnss)
hier_df.groupby(level='cty',axis=1).count()

2、计算分组摘要统计

统计包括计数、平均值、标准差、或用户自定义函数
  • 数据聚合
    quantile可以计算DataFrameSeries样本分位数
df
Out:
	key1	key2	data1	data2
0	a	one	-1.216684	-0.116255
1	a	two	-1.264090	-1.455701
2	b	one	-0.241362	-0.732853
3	b	two	-0.234600	1.182641
4	a	one	-0.517819	0.840338
grouped = df.groupby('key1')
grouped['data1'].quantile(0.9)

自定义聚合函数

def peak_to_peak(arr):
    return arr.max()-arr.min()
grouped.agg(peak_to_peak)
grouped.describe()

3、分组级运算和转

聚合是分组运算中的一种,是数据转换的一个特例

为一个Dataframe添加一个用于存放各索引分组平均值的列
  • 先聚合再合并
k1_means = df.groupby('key1').mean().add_prefix('mean_')
k1_means
Out:
	mean_data1	mean_data2
key1		
a	-0.999531	-0.243873
b	-0.237981	0.224894

pd.merge(df,k1_means,left_on='key1',right_index=True)
  • transform方法
key = ['one','two','one','two','one']
people.groupby(key).mean()
people.groupby(key).transform(np.mean)
people
Out:
		a			b			c			d			e
joe		-0.115445	-0.084339	0.199401	0.972242	0.304742
steve	-0.021287	-1.053292	1.441496	-0.606788	1.137274
wes		-0.990943	NaN			NaN			0.472071	0.361137
jim		-0.332479	-0.492248	-0.298820	-1.039121	0.390657
travis	-0.226006	-0.111077	0.553626	1.211031	0.934692
从各组减去平均值,该值会被广播出去,首先创建一个距平化函数
def demean(arr):
    return arr-arr.mean()
demeaned = people.groupby(key).transform(demean)

4、用特定于分组的值填充缺失值

特定的值可以是平均值、中位数等等。

s=Series(np.random.randn(6))
s[::2]=np.nan
s.fillna(s.mean())

假设需要对不同对分组填充不同的值,美国的几个州的实力数据,这些州又被分为西部和中部

states = ['ohio','newyork','vermont','florida','oregon','nevada','california','idaho']
group_key = ['east']*4 +['west']*4
data = Series(np.random.randn(8),index=states)
  • 第一种方法
data[['vermont','nevada','idaho']]=np.nan
data
Out:
ohio          0.118091
newyork      -0.324106
vermont            NaN
florida      -0.208641
oregon       -0.710107
nevada             NaN
california    1.998600
idaho              NaN
dtype: float64

data.groupby(group_key).mean()
fill_mean = lambda g:g.fillna(g.mean())
data.groupby(group_key).apply(fill_mean)
  • 第二种方法,运用name属性
fill_values = {'east':0.5,'west':-1}
fill_func = lambda g : g.fillna(fill_values[g.name])
data.groupby(group_key).apply(fill_func)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多元回归是一种统计分析方法,它可以用来建立一个因变量与多个自变量之间的关系模型。在二手车销售数据的分析中,我们可以使用多元回归模型来探究不同的因素对二手车价格的影响。 下面是使用Python进行多元回归分析的步骤: 1. 导入所需的库和数据集 ```python import pandas as pd import statsmodels.formula.api as smf # 读取数据集 data = pd.read_csv('二手车销售数据.csv') ``` 2. 确定自变量和因变量 在这个例子中,我们的因变量是二手车销售价格,自变量包括车龄(Age)、公里数(Mileage)、品牌(Brand)和车型(Model)。 ```python formula = 'Price ~ Age + Mileage + Brand + Model' ``` 3. 构建多元回归模型 ```python model = smf.ols(formula=formula, data=data).fit() print(model.summary()) ``` 4. 分析回归系数和统计显著性 在模型摘要中,我们可以看到每个自变量的回归系数、标准误差、t值和p值。其中,p值小于0.05表示该自变量对因变量的影响是显著的。 5. 检查残差分布 我们可以使用残差图来检查模型的拟合效果。如果残差随着预测值的增加而增加或减少,则说明模型可能存在问题。 ```python import matplotlib.pyplot as plt # 绘制残差图 fig, ax = plt.subplots(figsize=(8, 6)) ax.scatter(model.predict(), model.resid) ax.axhline(y=0, color='red', linestyle='--') ax.set_xlabel('Predicted values') ax.set_ylabel('Residuals') plt.show() ``` 通过以上步骤,我们可以使用Python对二手车销售数据进行多元回归分析,并得出不同因素对二手车价格的影响程度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值