pandas - 根据条件替换一行中的值
问题描述
我正在尝试根据 2 个条件填写一列。在这种情况下,索引(时间序列)是否介于日出和日落之间,在这种情况下,我希望在名为“sunlight”的新列中为 1。否则,我希望该值为零。我是 excel 中的熊猫新手所以我正在尝试这样做,可能是错误的。
df['sunlight'] = 0
mask1 = df.index > df['sunrise']
mask2 = df.index < df['sunset']
df[mask1 & mask2]
df.loc[df[mask1 & mask2],'sunlight'] = 1
df
指数 | 日出 | 日落 | 阳光 |
---|---|---|---|
08:18:00 | 08:19:17 | 15:56:43 | 0 |
08:19:00 | 08:19:17 | 15:56:43 | 0 |
08:20:00 | 08:19:17 | 15:56:43 | 1 |
08:21:00 | 08:19:17 | 15:56:43 | 1 |
08:22:00 | 08:19:17 | 15:56:43 | 1 |
解决方案
让我们以仅包含频率为一小时(而不是几分钟)的数据的日期的 DataFrame 为例。
df = pd.DataFrame({'sunrais':[pd.to_datetime('2020-01-01 08:19:17')]*24,
'sunset':[pd.to_datetime('2020-01-01 15:46:43')]*24 },
index=pd.date_range('2020-01-01 00:00:00', '2020-01-01 23:00:00', freq='H')
)
如果您现在将真值转换为整数,您可以一步将两个选择相乘。
df['sunlight'] = (df['sunrais']<df.index).astype(int) * (df.index<df['sunset']).astype(int)
输出如下所示:
sunrais sunset sunlight
2020-01-01 07:00:00 2020-01-01 08:19:17 2020-01-01 15:46:43 0
2020-01-01 08:00:00 2020-01-01 08:19:17 2020-01-01 15:46:43 0
2020-01-01 09:00:00 2020-01-01 08:19:17 2020-01-01 15:46:43 1
2020-01-01 10:00:00 2020-01-01 08:19:17 2020-01-01 15:46:43 1
推荐阅读
- r - “递归索引在级别 4 失败”R 代码
- docker - Nginx反向代理不重定向?
- mysql - SQL查询生成排行榜并选择一个玩家信息
- loopback - 具有不同关系属性名称的环回中的多对多关系
- typescript - 打字稿泛型和类属性
- javascript - D3 js条形图平移
- python - 无法从 Python 中的 S3 存储桶下载图像/代码已经有访问密钥
- arraylist - 如何使对象在处理中的特定时间后出现
- android - Android 在 RecycleView 中处理 Google Map 的滚动
- boolean-logic - 布尔表达式简化作业 - 你能指出我的错误吗?