首页 > 解决方案 > 添加具有其他列名称作为变量的列

问题描述

我的目标是添加一个标题名称为“阶段”的列,它将容纳列的名称“阶段 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

有一个很好的解决方案吗?我正在尝试结合lookupand where,但我什至不确定我的方向是否正确。欢迎任何想法,谢谢!

标签: python-3.xpandas

解决方案


如果您的阶段日期越来越多地排序:

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

推荐阅读