【问题标题】:How can I optimize this dataframe filtering?如何优化此数据框过滤?
【发布时间】:2017-04-06 12:58:46
【问题描述】:

我有一个天气数据的数据框:

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

我还尝试按日期和数据值对数据框进行排序,并选择列表中的第一个作为最大值,最后一个作为最小值:

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

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

【问题讨论】:

    标签: python optimization dataframe filter


    【解决方案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 的成本就越高。因此,您可能希望实际将最大值和最小值附加到列表中,具体取决于您正在分析的数据量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2012-04-29
      • 2020-08-24
      • 1970-01-01
      相关资源
      最近更新 更多