Как заполнить пропущенное значение на основе других столбцов в кадре данных Pandas?

19

Предположим, у меня есть кадр данных 5 * 3, в котором третий столбец содержит пропущенное значение

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

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

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

Как я могу сделать это, используя фрейм данных? Благодарю.

Как добавить условие для расчета недостающего значения, как это?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1
Кил
источник
Вы не можете сделать это, потому что размер не будет равным
Mayur Dangar
Можете ли вы расширить свой ответ? Почему это невозможно и что он мог сделать, чтобы решить проблему?
Дамиан Мельничук
эй, даже у меня такой же вопрос. но что если данные, с которыми я имею дело, являются текстовыми? это условие похоже на то, что «если« ингредиенты »содержат курицу, тогда« тип »= non-veg»
user7389747

Ответы:

17

Предполагая три столбца вашего фрейма данных a, bи c. Это то, что вы хотите:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Полный код:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)
Icyblade
источник
Несколько лет спустя, но это работает только тогда, когда столбцы числовые. np.isnanне поддерживает нечисловые данные. Это не проблема, так как у ОП были числовые столбцы и арифметические операции, но в остальном pd.isnullэто лучшая альтернатива.
Адарш Чавакула
3

Другой вариант:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B

Вишал
источник
3

Как насчет использования fillna()метода dataframe?

df['C'].fillna(df.A * df.B)

yosemite_k
источник
2

Предполагая, что три столбца в вашем фрейме данных a, bи c. Затем вы можете выполнить необходимую операцию следующим образом:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])
enterML
источник
1
Илиnp.where(pd.isnull(df.c), df.a * df.b, df.c)
Валентина