首页 > 解决方案 > Pandas - 使用列计算值时,当列满足条件时将值设置为 0

问题描述

我有以下按日期索引的数据框:

              id
2019-02-01  1234
2019-02-01  1234
2019-02-02  1234
2019-02-02  2345
2019-02-02  3456
2019-02-03  4567
2019-02-04  4567
2019-02-05     0
2019-02-06  1234
2019-02-07  2345
2019-02-08     0                        

同一天可以有多个 ID,并且同一 ID 可以在同一天出现。请注意,0 值不会出现在具有至少 1 个有效 ID 的日期。

我正在尝试计算每个 ID 每天的平均计数。我有以下创建平均值:

df = df.groupby(df.index)[['id']].count() / df.groupby(df.index).agg({'id': 'nunique'})

不幸的是,这包括那些值为 0 的 ID,这导致平均计数设置为 1,即 1 / 1。它需要为 0。

我希望实现的是那些 ID 为 0 的日子默认设置为 0,否则计算平均值。

计算后我无法更新数据框,因为可以有 1 的有效平均值。

我希望有一种简单的方法可以做到这一点。提前感谢您的任何帮助。

标签: pythonpandas

解决方案


您可以将 0 替换为NaNfirst,以便0不计算值:

df['id'] = df['id'].replace(0,np.nan)
df = df.groupby(df.index)['id'].count().to_frame()
df
Out[1]: 
            id
2019-02-01   2
2019-02-02   3
2019-02-03   1
2019-02-04   1
2019-02-05   0
2019-02-06   1
2019-02-07   1
2019-02-08   0

如果你只想在只有一个值的日子里这样做,那么你可以做同样的事情,但只在计数为 1 的日子里mask检查 index value_counts() == 1

df['id'] = df['id'].mask(df.index.value_counts() == 1, df['id'].replace(0,np.nan))
df = df.groupby(df.index)['id'].count().to_frame()
df
Out[2]: 
            id
2019-02-01   2
2019-02-02   3
2019-02-03   1
2019-02-04   1
2019-02-05   0
2019-02-06   1
2019-02-07   1
2019-02-08   0

推荐阅读