由两列分组的平均值,窗口为 3 个月,NaN 少于 3 个月

Posted

技术标签:

【中文标题】由两列分组的平均值,窗口为 3 个月,NaN 少于 3 个月【英文标题】:Mean grouped by two columns with window by 3 months and NaN for less than 3 months 【发布时间】:2020-05-24 00:28:32 【问题描述】:

我必须按客户、帐户在此数据集中应用平均值计算,但此平均值需要每 3 个月应用到这些组中。对于没有3个月的客户A1200,结果需要NaN

customer    account    month        invoice
C1000       A1100      2019-10-01   34000
                       2019-11-01   55000
                       2019-12-01   80000
            A1200      2019-10-01   90000
                       2019-11-01   55000
            A1300      2019-10-01   10000
                       2019-11-01   10000
                       2019-12-01   20000
C2000       A2100      2019-10-01   78000
                       2019-11-01   55000
                       2019-12-01   80000

我尝试使用此命令,但平均值看起来不正确。

df_3m.groupby(['customer','account']).mean()

pandaspyspark 中是否有一些想法?

【问题讨论】:

只是为了确认分组没有满三个月,那么不要对相应的金额做任何事情。只需将金额替换为nan?如果有 4 个月,计算前 3 个月的平均值并将第 4 个月的金额替换为 nan,会发生什么情况? 【参考方案1】:

数据

+----------+---------+----------+----------+
| customer | account |  month   |  invoice |
+----------+---------+----------+----------+
| C1000    | A1100   | 01-10-19 |    34000 |
| C1000    | A1100   | 01-11-19 |    55000 |
| C1000    | A1100   | 01-12-19 |    80000 |
| C1000    | A1200   | 01-10-19 |    90000 |
| C1000    | A1200   | 01-11-19 |    55000 |
| C1000    | A1300   | 01-10-19 |    10000 |
| C1000    | A1300   | 01-11-19 |    10000 |
| C1000    | A1300   | 01-12-19 |    20000 |
| C2000    | A2100   | 01-10-19 |    78000 |
| C2000    | A2100   | 01-11-19 |    55000 |
| C2000    | A2100   | 01-12-19 |    80000 |
+----------+---------+----------+----------+

您的查询

res = df_3m.groupby(['customer','account']).mean()

查询以过滤具有less than 3 months 的帐户

lt_3 = df.groupby(['account']).count() >2

最终结果

res[lt_3]

输出

+----------+---------+--------------+
| customer | account |   invoice    |
+----------+---------+--------------+
| C1000    | A1100   | 56333.333333 |
|          | A1200   | NaN          |
|          | A1300   | 13333.333333 |
| C2000    | A2100   | 71000.000000 |
+----------+---------+--------------+

【讨论】:

【参考方案2】:

你可以试试这个:

df['month'] = pd.to_datetime(df['month'])
df = df.groupby(by=['customer', 'account']).mean()[df.groupby(by=['customer', 'account']).count() > 2].reset_index()
print(df)

输出:

  customer account       invoice
0    C1000   A1100  56333.333333
1    C1000   A1200           NaN
2    C1000   A1300  13333.333333
3    C2000   A2100  71000.000000

【讨论】:

嘿,太好了!它完美地工作!我不知道这个技巧[df_3m.groupby(by=['customer', 'account']).count() > 2],这是什么?以及它如何与另一部分代码结合? 条件就是这样,如下所示:df[df['number'] < 100],您只选择df 中列number 的值小于100 的行

以上是关于由两列分组的平均值,窗口为 3 个月,NaN 少于 3 个月的主要内容,如果未能解决你的问题,请参考以下文章

格式化按两列分组的熊猫数据系列,并在第三个重新采样,平均值为 dict

如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?

如何获得 PostgreSQL 中的两个平均值之间的差异,平均值在列上,最终表按两列分组?

Pandas 用给定分组的平均值替换 nan

如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?

Pandas 数据框:按两列分组,然后对另一列进行平均