最近做一个系列博客,跟着stackoverflow学Pandas。
专栏地址:http://blog.csdn.net/column/details/16726.html
以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序:
https://stackoverflow.com/questions/tagged/pandas?sort=votes&pageSize=15
Converting a Pandas GroupBy object to DataFrame-Groupby对象转换为DataFrame
split-apply-combine
我们在对数据进行清洗时,经常要用到split-apply-combine,首先对数据按照一定的标准进行split(分组),然后对每组数据进行apply(处理),最后把结果combine(合并),在这一系列操作中就必须要用到 pandas的groupby函数。
具体可以参考官方文档:
https://pandas.pydata.org/pandas-docs/stable/groupby.html
很多时候,GroupBy 对象不方便我们下一步操作,我们喜欢把他转化为DataFrame。下面介绍几种常用的方法。
参考:
https://stackoverflow.com/questions/10373660/converting-a-pandas-groupby-object-to-dataframe
转换
import pandas as pd
print(pd.__version__)
# 0.20.3
df1 = pd.DataFrame({"Name":["Alice", "Bob", "Mallory", "Mallory", "Bob" , "Mallory"],
"City":["Seattle","Seattle","Portland","Seattle","Seattle","Portland"]})
df1
#
# City Name
#0 Seattle Alice
#1 Seattle Bob
#2 Portland Mallory
#3 Seattle Mallory
#4 Seattle Bob
#5 Portland Mallory
#
g1 = df1.groupby(["Name", 'City']).size()
g1
# Name City
# Alice Seattle 1
# Bob Seattle 2
# Mallory Portland 2
# Seattle 1
# 如果要使用count,必须这样
df1.groupby(["Name", "City"])[['Name','City']].count()
# Name City
# Name City
# Alice Seattle 1 1
# Bob Seattle 2 2
# Mallory Portland 2 2
# Seattle 1 1
此时得到的g1
数据已经是DataFrame格式, 但是属于MultiIndex, 如果想得到方方正正的DataFrame格式,可以采用 reset_index()
函数。
type(g1)
# pandas.core.frame.DataFrame
g1.index
# MultiIndex(levels=[['Alice', 'Bob', 'Mallory'], ['Portland', 'Seattle']],
# labels=[[0, 1, 2, 2], [1, 1, 0, 1]],
# names=['Name', 'City'])
g1.reset_index()
print(g1.reset_index())
# Name City 0
# 0 Alice Seattle 1
# 1 Bob Seattle 2
# 2 Mallory Portland 2
# 3 Mallory Seattle 1
count和size的区别
这里出现的count和size的区别,如果想深究可以参考:
size 是考虑 NaN的计数,而 count 则不考虑。