python - 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 的有效平均值。
我希望有一种简单的方法可以做到这一点。提前感谢您的任何帮助。
解决方案
您可以将 0 替换为NaN
first,以便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
推荐阅读
- javascript - 如何在 JavaScript 中从 MP3 文件中读取元数据属性?
- docker - 在 ASP.NET Core 中作为 Docker 构建的一部分运行测试
- python - 使用 Monte Carlo 方法估计 pi 会导致比预期更大的值
- pine-script - 仅第一次显示文本
- ios - 如何在 swift spritekit 中创建重复段
- javascript - 如何在jquery中动态地进行行跨度分组?
- swift - 如何将故事板连接到 swiftui?
- javascript - Firebase JS:用于迭代嵌套数据的数据库调用
- r - 尽管以前可以正常工作,但我的代码中的波斯字体损坏
- r - “管道”、“点”和“美元”运算符的连接似乎在 R 中起作用?