2017-04-06 62 views
0

我有气象数据的数据帧:如何优化此数据帧筛选?

  ID  Date Element Data_Value 
0 USW00094889 2014-11-12 TMAX   22 
1 USC00208972 2009-04-29 TMIN   56 
2 USC00200032 2008-05-26 TMAX   278 
3 USC00205563 2005-11-11 TMAX   139 
4 USC00200230 2014-02-27 TMAX  -106 
5 USW00014833 2010-10-01 TMAX   194 
6 USC00207308 2010-06-29 TMIN   144 
7 USC00203712 2005-10-04 TMAX   289 
8 USW00004848 2007-12-14 TMIN   -16 
9 USC00200220 2011-04-21 TMAX   72 
10 USC00205822 2013-01-16 TMAX   11 
11 USC00205822 2008-05-29 TMIN   28 
12 USC00203712 2008-10-17 TMIN   17 
13 USC00205563 2006-05-14 TMAX   183 
14 USC00200842 2006-05-14 TMAX   122 

.... 

165083 USC00200230 2006-11-29 TMIN   117 

我想提出两个列表 - 最小和最大温度的每一天。 我试图做的方法是通过使所有日期的列表: dates = df['Date'].unique(),然后通过数据循环和附加价值,以这些名单:

for i in dates: 
    minT.append(df[(df['Date']==i) & (df['Element'] == 'TMIN')]['Data_Value'].min()) 
    maxT.append(df[(df['Date']==i) & (df['Element'] == 'TMAX')]['Data_Value'].max()) 

我也试图通过日期和data_values排序的数据帧,并挑选出第一个在列表中最高,而去年为分:

df = df.sort_values(['Date','Data_Value'], ascending=False) 

for i in dates: 
    minT.append(df[df['Date']==dates[0]]['Data_Value'].values[-1]) 
    maxT.append(df[df['Date']==dates[0]]['Data_Value'].values[0]) 

,但一切仍需要reeeeeeeally长:(......可能有人请帮我做这个快

回答

1

你可能想尝试pandas.DataFrame.groupby方法:

# GENERATE SOME TEST DATA 
data = \ 
    u""" 
    ID,Date,Element,Data_Value 
    USW00094889,2014-11-12,TMAX,22 
    USC00208972,2014-11-12,TMIN,56 
    USC00200032,2008-05-26,TMAX,278 
    USC00205563,2005-11-11,TMAX,139 
    USC00200230,2014-02-27,TMAX,-106 
    USW00014833,2010-10-01,TMAX,194 
    USC00207308,2010-06-29,TMIN,144 
    USC00203712,2012-06-29,TMAX,289 
    USW00004848,2007-12-14,TMIN,-16 
    USC00200220,2011-04-21,TMAX,72 
    USC00205822,2013-01-16,TMAX,11 
    USC00205822,2008-05-29,TMIN,28 
    USC00203712,2006-05-14,TMIN,17 
    USC00205563,2006-05-14,TMAX,183 
    USC00200842,2006-05-14,TMAX,122 
    """ 

buffer = io.StringIO(data) 
df = pandas.DataFrame.from_csv(buffer).reset_index(0) 

# Here is your magic sauce for iteration 
grouper = df.groupby('Date') 
df_min_max = pandas.DataFrame(columns=['min', 'max']) 

# You can now use the grouper for iteration 
for date, data in grouper: 
    df_min_max.loc[date, 'min'] = min(data['Data_Value']) 
    df_min_max.loc[date, 'max'] = max(data['Data_Value']) 

注意:如果你喜欢,你可以添加其他字段到您的输出数据帧。另外请注意,DataFrame变得越大,附加到DataFrame的成本就越高。因此,您可能需要将最大值和最小值附加到列表中,具体取决于您分析的数据量。