python-3.x - 添加具有其他列名称作为变量的列
问题描述
我的目标是添加一个标题名称为“阶段”的列,它将容纳列的名称“阶段 A”、“阶段 B”、“阶段 C”。
我希望能够将“采样日期”与阶段 A、B 和 C 的日期进行比较。根据时间轴上“采样日期”的位置,我想返回采样的阶段。
假设这个数据框:
phases=pd.DataFrame({'ID':['blue','red','yellow'], \
'sample date':['2018-05-23','2018-06-08','2018-06-01'], \
'phase A':['2018-03-22','2018-03-16','2018-03-09'], \
'phase B':['2018-06-02','2018-04-29','2018-05-19'], \
'phase C':['2018-09-30','2018-09-25','2018-09-12']})
phases['sample date']=pd.to_datetime(phases['sample date'])
phases['phase A']=pd.to_datetime(phases['phase A'])
phases['phase B']=pd.to_datetime(phases['phase B'])
phases['phase C']=pd.to_datetime(phases['phase C'])
# (I failed to convert all 4 columns to_datetimes in one row)
如果“阶段 B”>“样本日期”>=“阶段 A”,则新列应具有“阶段 A”。如果“采样日期”>=“C 阶段”,则该值应为“C 阶段”。如果 'sample date' < 'phase A',则该值应为 False 或 Nan。对于上面的例子,输出应该是:
ID sample date phase A phase B phase C phase
0 A 2018-05-23 2018-03-22 2018-06-02 2018-09-30 phase A
1 B 2018-06-08 2018-03-16 2018-04-29 2018-09-25 phase B
2 C 2018-06-01 2018-03-09 2018-05-19 2018-09-12 phase B
有一个很好的解决方案吗?我正在尝试结合lookup
and where
,但我什至不确定我的方向是否正确。欢迎任何想法,谢谢!
解决方案
如果您的阶段日期越来越多地排序:
s3 = phases['sample date'].ge(phases['phase C'])
s2 = phases['sample date'].ge(phases['phase B'])
s1 = phases['sample date'].ge(phases['phase A'])
phases['phase'] = np.select((s3,s2,s1), ('Phase C', 'Phase B', 'Phase A'), np.nan)
输出:
ID sample date phase A phase B phase C phase
0 blue 2018-05-23 2018-03-22 2018-06-02 2018-09-30 Phase A
1 red 2018-06-08 2018-03-16 2018-04-29 2018-09-25 Phase B
2 yellow 2018-06-01 2018-03-09 2018-05-19 2018-09-12 Phase B
推荐阅读
- java - Couchbase:使用 Java SDK 3 列出集群中可用的存储桶、范围和集合
- r - 为什么我的自定义函数无法正确转换经度和纬度?
- swift - 无法使用 AVSampleBufferAudioRenderer 播放 ACC 流
- go - gocb 访问包 gocb 中 results.go 中的内容 []byte
- python - Python 3.8 如何在 msg = get_message(service, user_id, msg_id) 命令之后读取行消息?
- python - 在 tkinter 中制作“粘贴”窗口的功能
- redis - 如何限制redis中的最大密钥大小
- python - 为什么 python append 方法不修改此字典中引用的列表?
- docker - 增加 Docker (Linux) 中的内存使用率
- firebase - Firebase 实时数据库,删除重复记录