Панды 'Eval' с NaN - PullRequest
       2

Панды 'Eval' с NaN

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

У меня есть DataFrame с данными в строке.Эти данные необходимо оценить и изменить на числовые.

Пусть мой df будет:

var_pct var_num
-76*2   14*1000000
-76*2   12*1000000
111*2   29*1000000
47*2    33*1000000
nan     60*1000000

for column in df:
    df[column] =df.eval(df[column],inplace=True)

Я столкнулся с проблемой для столбца с 'nan', где результат eval имеет длину меньше, чем оригинал.Как мне убедиться, что 'nan' будет '' после eval?

Ответы [ 2 ]

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

Вам следует избегать eval.В этом случае я рекомендую разбить на числовой ряд сначала:

df = df.fillna('NaN*NaN')

for col in df.columns:
    df = df.join(df.pop(col).str.split('*', expand=True)\
                   .apply(pd.to_numeric, errors='coerce')\
                   .add_prefix(f'{col}_'))

print(df)

   var_pct_0  var_pct_1  var_num_0  var_num_1
0      -76.0        2.0         14    1000000
1      -76.0        2.0         12    1000000
2      111.0        2.0         29    1000000
3       47.0        2.0         33    1000000
4        NaN        NaN         60    1000000

Затем выполнить вычисления, используя векторизованные операции:

for col in ['var_pct', 'var_num']:
    df[col] = df[f'{col}_0'] * df[f'{col}_1']

Для академическогоВ этом случае возможный подход возможен через функцию верхнего уровня pd.eval вместе с applymap.Но будьте осторожны, это просто неэффективный цикл на уровне Python.

nan = np.nan
df = df.fillna('nan*nan')

df = df.applymap(lambda x: pd.eval(x))

print(df)

   var_pct   var_num
0   -152.0  14000000
1   -152.0  12000000
2    222.0  29000000
3     94.0  33000000
4      NaN  60000000
0 голосов
/ 11 декабря 2018

Предполагая, что вы можете жить с скопированным фреймом данных:

def ff(val):
    if 'nan' not in val:
        return eval(val)

df4 = df3.applymap(ff)

print(df4)

   var_pct   var_num
0   -152.0  14000000
1   -152.0  12000000
2    222.0  29000000
3     94.0  33000000
4      NaN  60000000

Конечно, ff также может быть выражено как лямбда:

lambda val: eval(val) if 'nan' not in val else val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...