无需申请即可聚合熊猫数据框

时间:2021-07-24 13:45:36

标签: python pandas

我使用 this answer 来汇总我的数据。

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

    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

在没有申请的情况下解决此问题的任何帮助表示赞赏。提前致谢。

1 个答案:

答案 0 :(得分:1)

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

(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