Добавить столбец с именами других столбцов в качестве переменных - PullRequest
0 голосов
/ 25 сентября 2019

Моя цель - добавить столбец с именем заголовка «фаза», который будет содержать имя столбцов «фаза 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».Если «дата выборки» <«фаза A», тогда значение должно быть False или Nan.Для приведенного выше примера выходные данные должны быть: </p>

  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 и where, но я даже не уверен, в правильном ли я направлении.Любые идеи более чем приветствуются, спасибо!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Если ваша фазовая дата сортируется все чаще:

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
0 голосов
/ 25 сентября 2019

Это можно сделать с помощью np.select

con1=(phases['sample date']>=phases['phase A'])&(phases['sample date']<phases['phase B'])
con2=(phases['sample date']>=phases['phase C'])
con3=(phases['sample date']<phases['phase A'])
np.select([con1,con2,con3],['A','C',np.nan])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...