引用包¶
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
# Any results you write to the current directory are saved as output.
数据导入¶
data_dict = {'color' : ['black', 'white', 'black', 'white', 'black',
'white', 'black', 'white', 'black', 'white'],
'size' : ['S','M','L','M','L','S','S','XL','XL','M'],
'date':pd.date_range('1/1/2019',periods=10, freq='W' ),
'feature_1': np.random.randn(10),
'feature_2': np.random.normal(0.5, 2, 10)}
array=[['A','B','B','B','C','A','B','A','C','C'],['JP','CN','US','US','US','CN','CN','CA','JP','CA']]
index = pd.MultiIndex.from_arrays(array, names=['class', 'country'])
data_df = pd.DataFrame(data_dict,index=index)
data_df
分组¶
将dataframe根据size进行分组,得到group_1。在这里我们将GroupBy对象转换list后输出。
group_1 = data_df.groupby('size')
for i in list(group_1):
print(i)
对GroupBy对象进行分组运算,如sum(),非数值数据则不进行分组运算。将计算得到的数据添加表头前缀后输出
group_1.sum().add_prefix('sum_')
根据size进行分组后获得所有size值为M的行向量
group_1.get_group('M')
将dataframe根据size和color两个列标签进行多重分组,得到group_2
group_2 = data_df.groupby(['size', 'color'])
for i in list(group_2):
print(i)
对分组后的数据size函数获得组别个数
print(group_1.size())
print(group_2.size())
此外还可以利用函数进行分组。注意到groupby函数中axis=1对列进行分组,axis=0对行进行分组
def get_letter_type(letter):
if 'feature' in letter:
return 'feature'
else:
return 'other'
for i in list(data_df.groupby(get_letter_type, axis=1)):
print(i)
分组对象除了列标签之外,还可以是索引,其中用不同的level值来区分多重索引。
for i in list(data_df.groupby(level=[0,1])):
print(i)
DataFrame可以根据列标签和索引两者同时分组,分组后可以在不同组间进行迭代
group_3=df.groupby(['country','color'])
for name, group in group_3:
print(name)
print(group)
当GroupBy对象被建立后,我们可以用agg函数对分组后的数据进行计算。下例中计算了group_3中feature_1的最大值和feature_2的均值。
group_2.agg({'feature_1' : np.min,'feature_2' : np.mean})
接下来我们使用transform函数对groupby对象进行变换,transform的计算结果和原始数据的形状保持一致。下例中我们自定义了函数data_range来获得根据size分组后各个值的范围。
data_range = lambda x: x.max() - x.min()
data_df.groupby('size').transform(data_range)
另外我们还常常通过transform函数将缺失值替换为组间平均值。
data_df.iloc[1, 2:4] = np.NaN
group_4 = data_df.groupby('size')
f = lambda x: x.fillna(x.mean())
df_trans = group_4.transform(f)
df_trans
data_df
根据列标签color进行分组后对列标签feature_1使用rolling方法,滚动计算最新的三个值的平均。
data_df.groupby('color').rolling(3).feature_1.mean()
expanding函数会对给定的操作(如下例中的sum)进行叠加
data_df.groupby('color').expanding(3).feature_1.sum()
filter函数的参数是作用于整个组且返回值为True或False的函数,我们可以利用filter函数得到分组后的某些特定组别,如下例中元素个数大于三的分组。
data_df.groupby('class').filter(lambda x: len(x) > 3)
有些对于分组数据的处理用transform和aggregate都很难完成,这时候我们需要使用apply函数,apply相较两者更加灵活。在apply中可使用用自定义函数。
data_df.groupby('class')['feature_1'].apply(lambda x: x.describe())
def f(group):
return pd.DataFrame({'original' : group,'demeaned' : group - group.mean()})
data_df.groupby('class')['feature_1'].apply(f)
参考文献¶
- pandas toolkit
- https://cloud.tencent.com/developer/article/1193823