Как извлечь максимальные временные интервалы для столбцов, имена которых следуют шаблону - PullRequest
1 голос
/ 21 октября 2019

У меня есть фрейм данных pandas, подобный этому:

ID    |date   |X     |date:1  |X:1    |date:11 |X:11 ...  |date:1295|X:1295
1     |2011-08|5     |2011-09 |7      |No      |No   ...  |No       |No
2     |2011-10|5     |2011-12 |7      |2011-12 |21   ...  |No       |No
3     |2011-09|5     |2011-09 |7      |2012-01 |5    ...  |2017-11  |25
4     |2015-08|5     |No      |No     |No      |No   ...  |No       |No

ВОПРОС: Как извлечь максимальную продолжительность времени, которая существует в каждой строке?

В приведенном выше примере желаемым результатом может быть:

ID    |delta_date 
1     |1
2     |2
3     |74
4     |0

(единица измерения даты не имеет значения. Это могут быть дни, часы и т. Д., Но радиНапример, я выбрал месяц)

Предположение 1: названия заголовков следуют этой схеме: date, date:1, date1x (0< x <296). например: date, date:1, date:11, date:12, ..., date:19, date:110,...,date:119,...,date:1295

Предположение 2: столбцы ALL date содержат либо значение формата datetime, либо заполнитель No.

Предположение 3: date:1295 являетсянаибольшее числоДругими словами, максимальное количество сравниваемых ячеек в строке составляет 296.

1 Ответ

1 голос
/ 21 октября 2019

Предполагая, что даты растут в одной строке:

Вы можете попробовать выбрать только столбец даты с filter, используйте maskчтобы заменить «Нет» на «Нан», ffill вдоль столбцов, чтобы получить последнюю действительную дату для строки в последнем столбце, который вы выбрали, перед вычитанием первого столбца, подобного этому. Добавьте это в качестве столбца к вашему df:

df['delta_date'] = df.filter(like='date')\
                     .mask(df.filter(like='date').eq('No'))\
                     .ffill(axis=1)['date:1295']\
                   - df['date']

EDIT : если дата не увеличивается в одной строке, чтобы получить максимальную дельту, вы можете сделатьразница между max и min в ряду один раз изменит значение Нет на Nan:

df_date = df.filter(like='date').mask(df.filter(like='date').eq('No'))
df['delta_date'] = df_date.max(axis=1) - df_date.min(axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...