2015-12-09 9 views
1

Я думаю, что это лучше всего показать на примере. То, что я пытаюсь сделать, - найти ненулевой номер из группы и распространить его на остальную часть группы.Pandas groupby: заполните пропущенные значения от других членов группы

In [52]: df = pd.DataFrame.from_dict({1:{'i_id': 2, 'i_num':1}, 2: {'i_id': 2, 'i_num': np.nan}, 3: {'i_id': 2, 'i_num': np.nan}, 4: {'i_id': 3, 'i_num': np.nan}, 5: {'i_id': 3, 'i_num': 5}}, orient='index') 

In [53]: df 
Out[53]: 
    i_num i_id 
1  1  2 
2 NaN  2 
3 NaN  2 
4 NaN  3 
5  5  3 

DataFrame будет выглядеть примерно так. Я хочу взять все i_id == 2 и сделать их i_num == 1 и все i_id == 3 и сделать их i_num == 5 (так что оба соответствуют их непустым соседям группы).

Таким образом, конечный результат будет таким:

i_num i_id 
1  1  2 
2  1  2 
3  1  2 
4  5  3 
5  5  3 
+0

Что делать, если есть более чем один уникальный 'i_num' для данного' i_id '? Как вы выбираете, какое значение затем заполнить? – Alexander

ответ

2

first находит первое ненулевое значение в группе. Вы можете заполнить другие значения в каждой группе, как это:

df['i_num'] = df.groupby('i_id')['i_num'].transform('first') 

Это производит колонки в соответствии с требованиями:

i_num i_id 
1  1  2 
2  1  2 
3  1  2 
4  5  3 
5  5  3 

Имейте в виду, что это заменит все значения в группе с первым значением , а не только NaN значений (это, кажется, то, что вы ищете здесь, хотя).

В качестве альтернативы - и уважать любые другие ненулевые значения в группе - вы можете использовать fillna следующим образом:

# make a column of first values for each group 
x = df['i_id'].map(df.groupby('i_id')['i_num'].first()) 
# fill only NaN values using new column x 
df['i_num'] = df['i_num'].fillna(x) 
+0

Это сработало, спасибо! – user1610719

 Смежные вопросы

  • Нет связанных вопросов^_^