Python使用pandas中的循环有效地汇总数据

时间:2014-11-26 20:27:37

标签: python loops pandas

假设我有一个数据集,分为2005 - 2013年的数年

df = pd.read_csv('adj.csv')

列"事件","矢量","年",......等

我希望数据按年份分隔,然后将相同的函数(数据透视)应用于每个数据集。现在我要编写一个摘要,我写出这样的代码:

df2005=df[df['Year'] == 2005]
df2006=df[df['Year'] == 2006]
df2007=df[df['Year'] == 2007]
df2008=df[df['Year'] == 2008]
df2009=df[df['Year'] == 2009]
df2010=df[df['Year'] == 2010]
df2011=df[df['Year'] == 2011]
df2012=df[df['Year'] == 2012]
df2013=df[df['Year'] == 2013]

p2005=df2005.pivot_table(columns='Incident', index='Vector',
                             aggfunc=len,)
p2006=df2006.pivot_table(columns='Incident', index='Vector',
                             aggfunc=len,)
p2007=df2007.pivot_table(columns='Incident', index='Vector',
                             aggfunc=len,)

有没有更有效的方法来执行此操作或缩短此过程而不复制和粘贴代码df20XX=df[df['Year'] == 20XX], p20XX=df20XX.pivot_table(columns='Incident', index='Vector', aggfunc=len,)并将XX更改为年份?

2 个答案:

答案 0 :(得分:2)

我认为以下内容符合您的要求:

# get an array of the unique year values
year_vals = df.Year.unique()
# create our dict
data_dict={}
# iterate for each year make a key and set the value to the pivot table
for year in year_vals:
    data_dict[str(year)] = df[df.Year == year].pivot_table(columns='Incident', index='Vector',
                             aggfunc=len,)

然后您可以访问dict中的任何特定年份:

# this retrieves the pivot table for 2012
data_dict['2012']

答案 1 :(得分:0)

欢迎来到编程世界!如果你发现自己很难编写魔术数字'比如代码中的日期,你可能做错了。

正如@EdChum在评论中提到的,绕过硬编码年的一种方法是迭代列表。

您的问题让我们无法重现您的挑战,因为您没有向我们提供任何数据。所以我会做一些事情:

np.random.seed(1)
n = 1000
df = pd.DataFrame({'somedata' : np.random.normal(5,2,size=n),
                   'Year' : np.random.randint(10, size=n)})

print df.head()

   Year  somedata
0     2  8.248691
1     8  3.776487
2     9  3.943656
3     9  2.854063
4     9  6.730815

你可以像这样迭代每年:

for year in df.Year.unique():
    print year

通过使用groupby(),更多Pandas式的方式。这是一个例子:

 print df.groupby('Year').sum()


        somedata
Year            
0     566.042926
1     464.741896
2     481.299877
3     483.864814
4     448.654140
5     576.779496
6     495.640276
7     597.023765
8     456.119432
9     507.458331

您几乎可以编写任何函数来使用groupby()。要详细了解这一点,我强烈建议您阅读关于groupby()的优秀Pandas Documentation