Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在pandas中使用循环高效地汇总数据_Python_Loops_Pandas - Fatal编程技术网

Python在pandas中使用循环高效地汇总数据

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

假设我有一个从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]
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谢谢,但我正在试图找到一种方法来存储带有年份的数据透视表。