Pandas数据结构—数据分组及相关操作
一、分组 groupby
二、基本操作(一)
三、基本操作(二)
四、基本操作(三)
一、分组 groupby
groupby参数如下:
by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs
基本操作的一些方法:get_group() 、groups() 、size()、按数据类型分组、通过字典分组、通过Series分组、多函数计算agg()
二、基本操作(一)
# 分组后会得到一个新的dataframe
# axis参数模式 = 0,意思是以行来分组
# 多个列分组用([])来写
df = pd.DataFrame({
'A' : ['python', 'java', 'python', 'java','python', 'C++', 'java', 'python'],
'B' : ['P', 'P', 'J', 'C', 'J', 'J', 'P', 'C'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
print(df)
print('----------------------------------------------------------------')
# 注意:如果直接使用.groupby()这个方法,得到的只是一个groupby对象,它是一个中间数据,没有具体的数据内容呈现,
# 必须加入一个在.groupby()后面加上方法,才能进行计算。
# 根据A列进行分组
print('这是中间数据,没有具体的数据内容呈现:\n',df.groupby('A'))
print('----------------------------------------------------------------')
# 根据A列进行分组,并对分组进行求和
print('通过sum(),来呈现具体数据:\n',df.groupby('A').sum())
print('----------------------------------------------------------------')
# 根据A列进行分组,并对分组进行求平均
print('通过mean(),来呈现具体数据:\n',df.groupby('A').mean())
print('----------------------------------------------------------------')
# 根据A和B这两列同时分组。并对分组求和
a = df.groupby(['A','B']).sum()
print(a)
print('----------------------------------------------------------------')
# 根据A列进行分组,对D列求和,得到的结果只有D。
b = df.groupby(['A'])['D'].mean()
print(b)
print('----------------------------------------------------------------')
运行结果如下:
A B C D
0 python P 1.464222 0.311215
1 java P 0.094774 -0.550092
2 python J -1.675885 1.092220
3 java C -0.826553 0.193789
4 python J -1.015872 -0.483023
5 C++ J 1.779017 -0.875131
6 java P -0.897008 0.781554
7 python C -1.198245 -0.479048
----------------------------------------------------------------
这是中间数据,没有具体的数据内容呈现:
<pandas.core.groupby.DataFrameGroupBy object at 0x000001DDAFE312B0>
----------------------------------------------------------------
通过sum(),来呈现具体数据:
C D
A
C++ 1.779017 -0.875131
java -1.628787 0.425250
python -2.425780 0.441363
----------------------------------------------------------------
通过mean(),来呈现具体数据:
C D
A
C++ 1.779017 -0.875131
java -0.542929 0.141750
python -0.606445 0.110341
----------------------------------------------------------------
C D
A B
C++ J 1.779017 -0.875131
java C -0.826553 0.193789
P -0.802234 0.231462
python C -1.198245 -0.479048
J -2.691757 0.609197
P 1.464222 0.311215
----------------------------------------------------------------
A
C++ -0.875131
java 0.141750
python 0.110341
Name: D, dtype: float64
----------------------------------------------------------------
三、基本操作(二)get_group() 、groups() 、size()
df = pd.DataFrame({
'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 2, 3, 4]})
print(df)
print('----------------------------------------------------------------')
print(df.groupby('X'))
print('----------------------------------------------------------------')
print(type(df.groupby('X')))
print('----------------------------------------------------------------')
# 通过list()将分组后的数据变成list,list中的元素是元组。
a = list(df.groupby('X'))
# 打印的结果会看着比较奇怪,打印出两个元组,其中元组的第一个元素是组名,第二元素其实是一个dataframe。
print(a)
print('----------------------------------------------------------------')
# 以元组的形式进行呈现。因为分成了A和B的两组,所以[0]呈现的是有A的组
print(a[0])
print('----------------------------------------------------------------')
# 有B的组
print(a[1])
print('----------------------------------------------------------------')
# 通过for循环读取分组中的各元素。
# n表示分组的成名,g表示分组里的数据。
for n,g in a:
print(n)
print(g)
print(type(g))
print('#####################')
print('----------------------------------------------------------------')
# 通过get_group()获得分组后的组
print('获得分组A:\n',df.groupby(['X']).get_group('A'))
print('----------------------------------------------------------------')
print('获得分组A:\n',df.groupby(['X']).get_group('B'))
print('----------------------------------------------------------------')
# 通过.groups将分组后的结果转为字典(dict),可用字典索引方法来查看groups里的元素
# 这里需要注意的是groups返回的是index。
dg = df.groupby(['X'])
print(dg.groups)
print('----------------------------------------------------------------')
print(dg.groups['A'