首页 > 解决方案 > 没有应用的聚合熊猫数据框

问题描述

我用这个答案来汇总我的数据。

输入数据框(与上面的答案相同):

    latitude    longitude   d1  d2  ar  merge_time
0   15  10.0    12/1/1981 0:00  12/4/1981 3:00  2.317681391 1981-12-04 04:00:00
1   15  10.1    12/1/1981 0:00  12/1/1981 3:00  2.293604127 1981-12-01 04:00:00
2   15  10.2    12/1/1981 0:00  12/1/1981 2:00  2.264552161 1981-12-01 03:00:00
3   15  10.3    12/1/1981 0:00  12/4/1981 2:00  2.278556423 1981-12-04 03:00:00
4   15  10.1    12/1/1981 4:00  12/1/1981 22:00 2.168275766 1981-12-01 23:00:00
5   15  10.2    12/1/1981 3:00  12/1/1981 21:00 2.114636628 1981-12-01 22:00:00
6   15  10.4    12/1/1981 0:00  12/2/1981 17:00 1.384415903 1981-12-02 18:00:00
7   15  10.1    12/2/1981 8:00  12/2/1981 11:00 2.293604127 1981-12-01 12:00:00

apply但是,由于在更大的数据帧上使用,我遇到了巨大的性能问题。我试图在没有的情况下做到这一点apply,到目前为止,我想出了以下几点:

s = (df["d1"] != (df["d2"].shift() + pd.Timedelta("1H"))).cumsum()
df=(df.groupby(['latitude', 'longitude',s])
    .agg(
        ar=('ar', 'sum'),
        d1=('d1', 'min'),
        d2=('d2', 'max')
        )
    ).reset_index(level=-1, drop=True)

,但我得到

                          ar                  d1                  d2
latitude longitude                                                  
15       10.0       2.317681 1981-12-01 00:00:00 1981-12-04 03:00:00
         10.1       2.293604 1981-12-01 00:00:00 1981-12-01 03:00:00
         10.1       2.168276 1981-12-01 04:00:00 1981-12-01 22:00:00
         10.1       2.293604 1981-12-02 08:00:00 1981-12-02 11:00:00
         10.2       2.264552 1981-12-01 00:00:00 1981-12-01 02:00:00
         10.2       2.114637 1981-12-01 03:00:00 1981-12-01 21:00:00
         10.3       2.278556 1981-12-01 00:00:00 1981-12-04 02:00:00
         10.4       1.384416 1981-12-01 00:00:00 1981-12-02 17:00:00

我需要的是(与上面的答案相同的请求):

latitude    longitude   d1  d2  ar
15  10  12/1/1981 0:00  12/4/1981 3:00  2.317681391
15  10.1    12/1/1981 0:00  12/1/1981 22:00 4.461879893
15  10.2    12/1/1981 0:00  12/1/1981 21:00 4.379188789
15  10.3    12/1/1981 0:00  12/4/1981 2:00  2.278556423
15  10.4    12/1/1981 0:00  12/2/1981 17:00 1.384415903
15  10.1    12/2/1981 8:00  12/2/1981 11:00 2.293604127

感谢您在不应用的情况下解决此问题的任何帮助。提前致谢。

标签: pythonpandas

解决方案


您想要实现的目标的描述并不完全清楚,但以下给出了预期的输出:

(df.groupby(['latitude', 'longitude', (df['merge_time']-df['d2'])], sort=False)
   .agg({'d1': 'min', 'd2': 'max', 'ar': 'sum'})
   .droplevel(-1)
   .reset_index()
)

输出:

latitude  longitude                  d1                  d2        ar
      15       10.0 1981-12-01 00:00:00 1981-12-04 03:00:00  2.317681
      15       10.1 1981-12-01 00:00:00 1981-12-01 22:00:00  4.461880
      15       10.2 1981-12-01 00:00:00 1981-12-01 21:00:00  4.379189
      15       10.3 1981-12-01 00:00:00 1981-12-04 02:00:00  2.278556
      15       10.4 1981-12-01 00:00:00 1981-12-02 17:00:00  1.384416
      15       10.1 1981-12-02 08:00:00 1981-12-02 11:00:00  2.293604

推荐阅读