我有一个带有字符串数据的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之后的''?
答案 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.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
答案 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