[Py013] 理解pandas groupby
2018-10-25 本文已影响124人
安哥生个信
今天浏览pandas文档,原文见http://pandas.pydata.org/pandas-docs/stable/groupby.html。
当读到pandas objects can be split on any of their axes. The abstract definition of grouping is to provide a mapping of labels to group names.
时,有种醍醐灌顶的感觉。
之前一直对groupby
的使用不能得心应手,
现在突然醒悟了,其实最重要的就是传递一系列标签给函数。
这些标签都涉及方面呢?
- function:作用于行列名
- list或array:长度需要同待分组的行或者列相同
- dict或Series:针对行列名
- string:适用于dataframe,匹配行名或列名;df.groupby('A')等同于df.groupby(df['A'])
这些标签的作用是将不同的行(列)区分开(如何确定你的groupby
是按照行,还是按照列拆分表格?可以看 Py010)。
例如,设定一个函数,作用于列名,将含有元音字符的列名挑出来
In[34]: def get_letter_type(letter):
...: if letter.lower() in 'aeiou':
...: return 'vowel'
...: else:
...: return 'consonant'
...:
In[35]: grouped = df.groupby(get_letter_type, axis=1) #将上面定义的函数作用于列名
In[38]: grouped.groups #可以看到不同的列名被打上了不同的标签
Out[38]:
{'consonant': Index(['B', 'C', 'D'], dtype='object'),
'vowel': Index(['A'], dtype='object')}
# 通过人为添加的标签,可以将对应的列挑选出来
In[36]: grouped.get_group('vowel')
Out[36]:
A
0 foo
1 bar
2 foo
3 bar
4 foo
5 bar
6 foo
7 foo
In[37]: grouped.get_group('consonant')
Out[37]:
B C D
0 one -0.828158 -0.194829
1 one 1.019744 -1.526427
2 two -0.423719 -0.591102
3 three 2.053659 -1.536986
4 two 0.382964 0.887569
5 two -0.454750 -0.167476
6 one 0.689482 0.267907
7 three -0.443173 -1.928660
dict或Series的例子,可以参考这个https://blog.csdn.net/qq_36076233/article/details/77849037
其余的就不一一列举了
总之使用groupby
的中心思想就是(我目前认为哈)
想办法传递一个可以去匹配列名或者行名的匹配关系,
也就是给行名或者列名打上标签