Заполнение недостающих данных панд с использованием логики - PullRequest
0 голосов
/ 27 августа 2018

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

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 of 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. , поскольку этот фрейм данных содержит более 500 000 строк, как мне пройти весь набор данных? Моя первоначальная мысль - это цикл, но это было бы очень неэффективно и заняло бы много времени.

1 Ответ

0 голосов
/ 27 августа 2018

Используя 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
...