умножение данных в пандах с пропущенными значениями - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть фрейм данных с 2 столбцами (плавающие типы), но в одном из них отсутствуют данные, представленные строкой "..". При выполнении операции умножения возникает исключение, и вся операция прерывается.
ЧтоЯ пытаюсь добиться, чтобы выполнить умножение для значений с плавающей запятой и оставить ".." для пропущенных.

2 *  6  
.. * 4 

должно дать [12, ..]
Я нашел наивное решение, состоящее в том, чтобы заменить .. на 0, затем выполнить умножение, а затем заменить обратно 0 на .. Это не кажется оченьоптимизировано.Любое другое решение?

df['x'] = pd.to_numeric(df['x'], errors='coerce').fillna(0)  
mg['x'] = df['x'] * df["Value"]  
 for col in mg.columns:
    mg[col] = mg[col].apply(update)
def update(v):
    if (v == 0):
        return ".."
    return v

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете использовать np.where и Series.isna :

import numpy as np
mg['x'] = np.where(df['X'].isna(), df['X'], df['X']*df['Value'])

Если вы хотите заменить ноль на '..' и умножить другие:

mg['x'] = np.where(df['X'].isna(), '..', df['X']*df['Value'])

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

В вашем решении вы можететакже сделайте заполнение (1):

df['x'] = pd.to_numeric(df['x'], errors='coerce').fillna(1)  
mg['x'] = df['x'] * df["Value"]

Вот как я пытался:

df = pd.DataFrame({'X': [ 2, np.nan],
                  'Value': [6, 4]})
df

     X  Value
0   2.0  6
1   NaN  4

np.where(df['X'].isna(), df['X'], df['X']*df['Value'])
array([12., nan])
...