熊猫与NaN``评估''

时间:2018-12-11 16:16:53

标签: python pandas

我有一个带有字符串数据的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 :(得分:1)

您应避免使用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.evalapplymap一起使用您尝试的方法。但是请注意,这只是一个效率低下的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

答案 1 :(得分:0)

假设您可以使用复制的数据框:

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:

lambda val: eval(val) if 'nan' not in val else val