Фрейм данных (панды), заполняющий недостающие значения - PullRequest
0 голосов
/ 19 сентября 2019

Нас просят заполнить пропущенные значения в столбце фрейма данных (скажем, df ['A']), исходя из следующих предположений: 1- Если значение df ['B'] для той же строки равнобольше 1000, используйте 0. 2- В противном случае используйте среднее значение df ['A']

Я использовал следующий код, и он работал хорошо.

mean_value = df['A'].mean()
df['A'].loc[(df['A'].isna()) & (df['B] > 1000)] = 0
df['A'].fillna(mean_value, inplace = True)

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

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

Вы можете попробовать этот арифметический способ, хотя однострочный в этом случае просто затрудняет чтение.Поскольку вы изменили свой вопрос с 2000 до 0, добавление не требуется.Итак, ответ

df['A'] = df.A.fillna((df['B'] <= 1000) * df.A.mean())
1 голос
/ 19 сентября 2019

Может быть, вы можете использовать это

check1 = df['A'].isna()
check2 = (df['A'].isna()) & (df['B'] > 1000)
df['A'] = np.where(check1 , np.where(check2,2000,df['A'].mean()), df['A'])

Пример ввода

      A     B
0   5.0     500
1   NaN     2000
2   3.0     1500
3   4.0     1100
4   NaN     7

Пример вывода

      A     B
0   5.0     500
1   2000.0  2000
2   3.0     1500
3   4.0     1100
4   4.0     7
1 голос
/ 19 сентября 2019

Вы можете проверить np.select

con1=(df['A'].isna()) & (df['B'] > 1000)
con2=df['A'].isna()
df['A']=np.select([con1,con2],[0,df['A'].mean()],default=df.A)
0 голосов
/ 19 сентября 2019

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

df['A'] = df.apply(lambda x: x['A'] if not(np.isnan(x['A'])) else (0 if x['B'] > 1000 else mean_value), axis = 1)

Есть идеи?

...