Python在pandas中使用循环高效地汇总数据
假设我有一个从2005年到2013年的数据集Python在pandas中使用循环高效地汇总数据,python,loops,pandas,Python,Loops,Pandas,假设我有一个从2005年到2013年的数据集 df = pd.read_csv('adj.csv') 有“事件”、“向量”、“年份”等栏 我希望数据按年份分开,然后对每个数据集应用相同的函数(pivot)。现在,为了生成一个摘要,我正在编写如下代码: df2005=df[df['Year'] == 2005] df2006=df[df['Year'] == 2006] df2007=df[df['Year'] == 2007] df2008=df[df['Year'] == 2008] df2
df = pd.read_csv('adj.csv')
有“事件”、“向量”、“年份”等栏
我希望数据按年份分开,然后对每个数据集应用相同的函数(pivot)。现在,为了生成一个摘要,我正在编写如下代码:
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,)
for year in df.Year.unique():
print year
有没有一种更有效的方法可以做到这一点或缩短这一过程,而无需复制和粘贴代码
df20XX=df[df['Year']==20XX],p20XX=df20XX.pivot_table(columns='Incident',index='Vector',aggfunc=len),
并将XX
改为年份?欢迎来到编程世界!如果你发现自己在代码中硬编码“神奇数字”,比如日期,那么你可能是做错了
正如@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
您可以像这样每年迭代一次:
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,)
for year in df.Year.unique():
print year
更为独特的方法是使用groupby()
。下面是一个例子:
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()
的文章,我认为以下内容可以满足您的要求:
# 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']
您只需获取唯一值,将其转换为列表,然后对其进行枚举即可生成数据透视。因此,类似于
vals=df.Year.unique()
的东西,然后您可以迭代这个,并将透视表附加到列表中,或者添加到dict或其他东西中similar@EdChum你是个聪明人。但是你需要把这些智慧放在回答框里@ccsv只是一个建议。跳过分离,把年份作为pivot_表的一部分,怎么样?例如:index=['Year','Vector']@JD_Long谢谢,但我正在试图找到一种方法来存储带有年份的数据透视表。