Есть ли в пандах какой-нибудь более простой способ заменить нулевые значения, кроме цикла, в этом случае? - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь заменить нулевые значения режимом чисел в каждой группе (групповая область). Есть ли в Пандах какой-нибудь более простой способ сделать это?

Я сделал это с помощью метода цикла, который не рекомендуется для очень больших наборов данных.

data = {'area':['abc', 'abc', 'abc', 'abc','bcd', 'bcd', 'bcd' , 
'cde','cde', 'cde', 'cde', 'cde'], 'number':[1, 2, 2, np.nan, 3, 3, 
np.nan, 5, 5, 4, np.nan, np.nan]}
df = pd.DataFrame(data)

Hell = pd.DataFrame(df.groupby("area")['number'].agg(lambda 
x:x.value_counts().index[0])).reset_index()

import math
for index in range(0,df.shape[0]):   
    if math.isnan(df['number'][index]):
        for i in range(0,Hell.shape[0]):
            if Hell['area'][i] == df['area'][index]:
                df['number'][index] = Hell['number'][i]

1 Ответ

2 голосов
/ 17 октября 2019

Используйте Series.fillna с Series.map для замены на согласованные значения на area:

df['number'] = df['number'].fillna(df['area'].map(Hell.set_index('area')['number']))
print (df)
   area  number
0   abc     1.0
1   abc     2.0
2   abc     2.0
3   abc     2.0
4   bcd     3.0
5   bcd     3.0
6   bcd     3.0
7   cde     5.0
8   cde     5.0
9   cde     4.0
10  cde     5.0
11  cde     5.0

Или используйте ваше решение с GroupBy.transform для той же серии, как и оригинал, заполненный совокупными значениями:

s = df.groupby("area")['number'].transform(lambda x: x.value_counts().index[0])
#alternative
#s = df.groupby("area")['number'].transform(lambda x: x.mode().iat[0])
df['number'] = df['number'].fillna(s)
print (df)
   area  number
0   abc     1.0
1   abc     2.0
2   abc     2.0
3   abc     2.0
4   bcd     3.0
5   bcd     3.0
6   bcd     3.0
7   cde     5.0
8   cde     5.0
9   cde     4.0
10  cde     5.0
11  cde     5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...