#python #pandas
Вопрос:
Я хочу рассчитать разницу во времени ,но в содержимом есть текст NaN, можно ли это сделать?
Исходные данные
TimeStamp 81 1285 82 1285 83 NaN 84 1287 85 1287 86 1287 87 NaN 88 1294 89 1294 90 1294
ожидаемый
TimeStamp diff 81 1285 NaN 82 1285 0 83 NaN NaN 84 1287 NaN 85 1287 0 86 1287 0 87 NaN NaN 88 1294 NaN 89 1294 0 90 1294 0
У меня есть еще один вопрос: добавьте столбец идентификаторов ,рассчитайте разницу во времени на основе категории идентификаторов
Исходные данные
TimeStamp ID 81 1285 0 82 1285 1 83 NaN 0 84 1287 1 85 1287 0 86 1287 1 87 NaN 0 88 1294 1 89 1294 0 90 1294 1
ожидаемый
TimeStamp ID diff 81 1285 0 NaN 82 1285 1 NaN 83 NaN 0 NaN 84 1287 1 2 85 1287 0 NaN 86 1287 1 0 87 NaN 0 NaN 88 1294 1 7 89 1294 0 NaN 90 1294 1 0
Комментарии:
1. Почему существуют НАНЫ? Можно ли было этого избежать, и если нет, можете ли вы заменить их на 0, чтобы данные все еще что-то значили?
2. Из-за последующей обработки
Ответ №1:
Если ваш столбец или NAN являются строками, просто преобразуйте их в float:
df['diff'] = df['TimeStamp'].astype(float).diff()
Выход:
TimeStamp diff 81 1285 NaN 82 1285 0.0 83 NaN NaN 84 1287 NaN 85 1287 0.0 86 1287 0.0 87 NaN NaN 88 1294 NaN 89 1294 0.0 90 1294 0.0
Ответ №2:
Причина, по которой вы получаете NAN в результирующем ряду, заключается в том, что вычитание с неопределенным значением также не определено. Вам решать, как вы хотите с этим справиться.
Если вы хотите заменить все NAN в оригинальной серии 0
, вы можете это сделать
gt;gt;gt; s.fillna(0).diff() 81 NaN 82 0.0 83 -1285.0 84 1287.0 85 0.0 86 0.0 87 -1287.0 88 1294.0 89 0.0 90 0.0 Name: TimeStamp, dtype: float64
fillna
возвращает новую серию, в которой все NAN заменены 0
.
Ответ №3:
Давайте попробуем groupby
df['new'] = df.groupby(df.TimeStamp.isna().cumsum())['TimeStamp'].diff() df TimeStamp new 81 1285.0 NaN 82 1285.0 0.0 83 NaN NaN 84 1287.0 NaN 85 1287.0 0.0 86 1287.0 0.0 87 NaN NaN 88 1294.0 NaN 89 1294.0 0.0 90 1294.0 0.0