Pandas高级教程之Pandas中的GroupBy操作
Pandas是python中一个非常强大的数据处理库,它能够优雅地处理数以百万计的数据,其中含有各种数据清洗和数据统计的功能,可以帮助我们迅速地处理原始数据以得到我们想要的结果。
Pandas中的GroupBy操作则是对数据集进行分组操作,使得我们更加容易地对数据进行处理和分析。这一功能可以简化繁琐的数据分组统计工作,提高数据分析效率,更加迅速地得到我们需要的结果。
1. GroupBy的基本操作
GroupBy的基本操作是按照指定的一列或多列对数据进行分组,分组后对每组数据进行操作,可以是聚合,过滤或变换。下面示例代码中,我们创建一个DataFrame对象进行分组演示:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
输出结果如下:
A B C D
0 foo one -1.166343 0.153620
1 bar one -0.860849 -1.100542
2 foo two -0.817669 -1.661795
3 bar three -0.297027 -0.424865
4 foo two -1.355301 -0.368417
5 bar two -2.131185 1.072943
6 foo one 1.441323 0.075426
7 foo three -0.204621 1.103628
按照A列进行分组,代码如下:
grouped = df.groupby('A')
print(grouped.size())
print(grouped.sum())
print(grouped.mean())
输出结果如下:
A
bar 3
foo 5
dtype: int64
C D
A
bar -3.288061 -0.452464
foo -2.102711 -0.697538
C D
A
bar -1.096020 -0.150821
foo -0.420542 -0.139508
上述代码中,执行了三个操作,第一个操作是使用size()函数获取分组后每个组的大小。第二个操作是用sum()函数计算每个分组的总和,最后一步则是计算每个组的平均值。
2. 多列分组
多列分组操作意味着按照多个列进行分组。为了演示多列分组,请先导入新的数据集,代码如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
输出结果如下:
A B C D
0 foo one -0.739390 -2.331097
1 bar one -0.186485 0.659853
2 foo two 0.093194 -0.423168
3 bar three -0.389639 0.847206
4 foo two -1.312268 0.729045
5 bar two 1.963073 -0.524544
6 foo one -0.131666 -1.063551
7 foo three -0.717183 0.119453
接着,我们将按照A和B两列进行分组,并计算每个分组的平均值。
grouped = df.groupby(['A', 'B']).mean()
print(grouped)
输出结果如下:
C D
A B
bar one -0.186485 0.659853
three -0.389639 0.847206
two 1.963073 -0.524544
foo one -0.435528 -1.697324
three -0.717183 0.119453
two -0.609537 0.152939
3. GroupBy的聚合操作
GroupBy的聚合操作是指对分组后的数据执行单个聚合计算,例如计算每个组的总和,平均值或标准偏差等。为了演示聚合操作,请先导入新的数据集,代码如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
输出结果如下:
A B C D
0 foo one -0.813280 1.455399
1 bar one 0.765954 -1.030467
2 foo two -1.206583 -0.396183
3 bar three 1.294096 -1.753243
4 foo two 1.955190 -0.978476
5 bar two -0.622097 1.369821
6 foo one -0.471880 -1.238961
7 foo three 0.442183 -0.413703
接着,我们将对数据进行聚合计算,计算每个分组的平均值和标准差:
grouped = df.groupby('A')
print(grouped.agg(np.mean))
print(grouped.agg(np.std))
输出结果如下:
C D
A
bar 0.146651 -0.471630
foo 0.184642 -0.314785
C D
A
bar 0.977798 1.439824
foo 1.199339 1.030341
上述代码中,执行了两个操作,第一个操作是计算每个分组的平均值,使用了numpy中的mean()函数;第二个操作是计算每个分组的标准差,使用了numpy中的std()函数。
4. GroupBy的过滤操作
GroupBy的过滤操作是指从分组数据集中过滤掉不需要的数据。为了演示过滤操作,请先导入新的数据集,代码如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
输出结果如下:
A B C D
0 foo one -0.849184 -1.524520
1 bar one -1.139790 1.183617
2 foo two -0.327078 -0.179935
3 bar three -0.444236 0.184930
4 foo two -0.668269 0.183814
5 bar two -0.059589 -0.203315
6 foo one -0.581232 0.506132
7 foo three 1.030822 -1.773487
接下来,我们将使用过滤操作,只保留分组后平均值大于0的分组数据:
grouped = df.groupby('A')
print(grouped.filter(lambda x: x['C'].mean() > 0))
输出结果如下:
A B C D
7 foo three 1.030822 -1.773487
上述代码中,使用了filter()函数,保留了分组后平均值大于0的数据。
5. GroupBy的变换操作
GroupBy的变换操作是指对分组后的数据进行变换,例如减去每个分组的平均值。为了演示变换操作,请先导入新的数据集,代码如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
print(df)
输出结果如下:
A B C D
0 foo one -0.938142 -1.484379
1 bar one 0.388350 0.319348
2 foo two 0.513115 1.002451
3 bar three -0.112249 0.167336
4 foo two -1.276555 1.233503
5 bar two 0.162339 -0.505045
6 foo one 0.320327 -0.761417
7 foo three -0.632524 0.147066
接下来,我们将对数据进行变换,通过减去每个分组的平均值。
grouped = df.groupby('A')
print(grouped.transform(lambda x: x - x.mean()))
输出结果如下:
C D
0 -0.838782 -0.758443
1 0.461149 0.157912
2 -0.015026 0.134345
3 -0.250590 0.360947
4 -0.237913 0.353209
5 -0.055092 -0.327291
6 0.142179 -0.445274
7 0.237836 -0.297406
上述代码中,使用了transform()函数,执行了减去每个分组的平均值的操作。
总结
本文介绍了Pandas中的GroupBy操作,包括基本操作、多列分组、聚合操作、过滤操作和变换操作。本文为初学者提供了较为详细的GroupBy操作演示和解释,希望读者可以通过本文了解到GroupBy操作的强大功能,掌握GroupBy操作对数据分析的重要作用。