Как сделать предварительное заполнение для каждой группы в пандах - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть кадр данных, аналогичный приведенному ниже.

id A   B   C   D E
1  2   3   4   5 5
1  NaN 4   NaN 6 7
2  3   4   5   6 6
2  NaN NaN 5   4 1

Я хочу выполнить вменение нулевого значения для столбцов A, B, C в прямом заполнении, но для каждой группы.Это означает, что я хочу, чтобы начальная заливка применялась к каждому id.Как я могу это сделать?

1 Ответ

0 голосов
/ 10 декабря 2018

Используйте GroupBy.ffill для прямого заполнения по группам для всех столбцов, но если первые значения по группам равны NaN с, замены нет, поэтому возможно использование fillna и последнее приведение к целым числам:

print (df)
   id    A    B    C  D    E
0   1  2.0  3.0  4.0  5  NaN
1   1  NaN  4.0  NaN  6  NaN
2   2  3.0  4.0  5.0  6  6.0
3   2  NaN  NaN  5.0  4  1.0

cols = ['A','B','C']
df[['id'] + cols] = df.groupby('id')[cols].ffill().fillna(0).astype(int)
print (df)
   id  A  B  C  D    E
0   1  2  3  4  5  NaN
1   1  2  4  4  6  NaN
2   2  3  4  5  6  6.0
3   2  3  4  5  4  1.0

Деталь:

print (df.groupby('id')[cols].ffill().fillna(0).astype(int))
   id  A  B  C
0   1  2  3  4
1   1  2  4  4
2   2  3  4  5
3   2  3  4  5

Или:

cols = ['A','B','C']
df.update(df.groupby('id')[cols].ffill().fillna(0))
print (df)
   id    A    B    C  D    E
0   1  2.0  3.0  4.0  5  NaN
1   1  2.0  4.0  4.0  6  NaN
2   2  3.0  4.0  5.0  6  6.0
3   2  3.0  4.0  5.0  4  1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...