如何优化此数据帧过滤?

时间:2017-04-06 03:57:24

标签: python optimization dataframe filter

我有天气数据的数据框:

            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())

我还尝试按日期AND data_values对数据框进行排序,然后选择列表中的第一个作为max,最后作为min:

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])

但是一切仍然需要很长时间:( ...有人可以帮助我加快速度吗?

1 个答案:

答案 0 :(得分: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变得越大,追加到DataFrame就越昂贵。因此,您可能希望实际将max和min值附加到列表中,具体取决于您要分析的数据量。