Заполнение недостающих данных панд с использованием логики

1

У меня есть dataframe с несколькими столбцами и отсутствующими данными:

Unit#      Mile        Direction
1 of 2     NaN         NaN
2 of 2     228.7mi     NaN
1 of 2     NaN         NaN
2 of 2     229.7mi     NaN
1 of 2     NaN         NaN
2 of 2     228.7mi     NaN
1 of 3     NaN         NaN
2 of 3     227.7mi     NaN
3 of 3     NaN         NaN

и я хочу сделать две вещи,

  1. Заполните столбец Mile, чтобы он соответствовал столбцу "2 x"
  2. Заполните столбец направления вверх или вниз в зависимости от того, в каком направлении находится столбец мили.

Идеальный выход будет следующим:

Unit#      Mile        Direction
1 of 2     228.7mi     Up
2 of 2     228.7mi     Up
1 of 2     229.7mi     Up
2 of 2     229.7mi     Up
1 of 2     228.7mi     Down
2 of 2     228.7mi     Down
1 of 3     227.7mi     Down
2 of 3     227.7mi     Down
3 of 3     227.7mi     Down

Мои главные вопросы:

  1. как мне узнать, какой блок "1 из 2" я хочу заменить, и что делать, когда есть случайный "из 3" набора
  2. так как у этого блока данных есть строки 500000+, как мне пройти через весь набор данных? Моя первоначальная мысль - это цикл, но это будет очень неэффективно и займет много времени.
  • 1
    Существуют ли другие уникальные идентификаторы, которые разделяют единицы?
  • 0
    @ScottBoston Существует также столбец «DateTime» в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС.С», если это помогает, но это единственные уникальные столбцы
Теги:
pandas
python-3.x
algorithm
missing-data

1 ответ

3

Используя cumcount и cumsum, создайте ключ группы

s = df.groupby(['Unit#']).cumcount().diff().ne(0).cumsum()
s
Out[606]: 
0    1
1    1
2    2
3    2
4    3
5    3
6    4
7    4
8    4
dtype: int32

Затем мы заполняем Mile

df.Mile=df.Mile.groupby(s).apply(lambda x : x.ffill().bfill())

s1=pd.to_numeric(df.Mile.str[:-2]).diff().fillna(1)

df.loc[s1>0,'Direction']='Up'
df.loc[s1<0,'Direction']='Down'
df.Direction=df.Direction.ffill()

***Yield:*** 

df
Out[622]: 
  Unit#     Mile Direction
0  1of2  228.7mi        Up
1  2of2  228.7mi        Up
2  1of2  229.7mi        Up
3  2of2  229.7mi        Up
4  1of2  228.7mi      Down
5  2of2  228.7mi      Down
6  1of3  227.7mi      Down
7  2of3  227.7mi      Down
8  3of3  227.7mi      Down
  • 0
    Спасибо, что нашли время, чтобы помочь! к сожалению, когда я запускаю это, матрица s запускается, как и ожидалось, но в итоге увеличивается на единицу, и я получаю около 100000 или около того различных идентификаторов
  • 0
    Это портит, когда есть 2 '3 из 3' Единицы рядом друг с другом
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню