Обновление существующих столбцов данных - PullRequest
0 голосов
/ 29 августа 2018

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

code      value
1          red
2          blue 
3          yellow
1
4          
4          pink
2          blue

поэтому я хочу обновить столбец значений, чтобы пустые строки заполнялись значениями из других строк. Итак, я знаю, что код 4 ссылается на значение pink, я хочу, чтобы оно обновлялось во всех строках, где это значение отсутствует.

Ответы [ 5 ]

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

Использование reindex

df.dropna().drop_duplicates('code').set_index('code').reindex(df.code).reset_index()
Out[410]: 
   code   value
0     1     red
1     2    blue
2     3  yellow
3     1     red
4     4    pink
5     4    pink
6     2    blue
0 голосов
/ 29 августа 2018

Вы можете использовать first значение данной code группы

In [379]: df.groupby('code')['value'].transform('first')
Out[379]:
0       red
1      blue
2    yellow
3       red
4      pink
5      pink
6      blue
Name: value, dtype: object

Назначить обратно

In [380]: df.assign(value=df.groupby('code')['value'].transform('first'))
Out[380]:
   code   value
0     1     red
1     2    blue
2     3  yellow
3     1     red
4     4    pink
5     4    pink
6     2    blue

Или

df['value'] = df.groupby('code')['value'].transform('first')
0 голосов
/ 29 августа 2018

Использование groupby и ffill и bfill

df.groupby('code').value.ffill().bfill()

0       red
1      blue
2    yellow
3       red
4      pink
5      pink
6      blue
Name: value, dtype: object
0 голосов
/ 29 августа 2018

Вы можете sort_values, ffill, а затем sort_index. Последний шаг может не понадобиться, если порядок не важен. Если это так, то двойная сортировка может быть неоправданно дорогой.

df = df.sort_values(['code', 'value']).ffill().sort_index()

print(df)

   code   value
0     1     red
1     2    blue
2     3  yellow
3     1     red
4     4    pink
5     4    pink
6     2    blue
0 голосов
/ 29 августа 2018

Вы можете создать серию из ваших пар code - value и использовать их для map:

my_map = df[df['value'].notnull()].set_index('code')['value'].drop_duplicates()

df['value'] = df['code'].map(my_map)

>>> df
   code   value
0     1     red
1     2    blue
2     3  yellow
3     1     red
4     4    pink
5     4    pink
6     2    blue

Просто чтобы увидеть, что происходит, вы передаете следующую серию map:

>>> my_map
code
1       red
2      blue
3    yellow
4      pink
Name: value, dtype: object

Так и сказано: «Где вы найдете 1, дайте значение red, где вы найдете 2, дайте blue ...»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...