import pandas as pd
df = pd.DataFrame({'RMDS': ['10.686000','NYSE_XNAS','0.472590','qrtr'], 'Mstar': ['10.690000', 'NYSE_XNAS', '0.473590','mnthly']})
数据帧df将如下所示:
Mstar RMDS
0 10.690000 10.686000
1 NYSE_XNAS NYSE_XNAS
2 0.473590 0.472590
3 mnthly qrtr
我想比较"RMDS"one_answers"Mstar"的值,数据帧的类型是"object",这是一个巨大的数据帧,我需要比较四舍五入的值
mask=np.around(pd.to_numeric(df.Mstar(,2(!=np.around(pd.to_numeric(df.RMDS(,2(
df_Difference=df[mask]
由于列中的值不一致,因此每当字符串值像"qrtr"一样出现时,上述逻辑都会失败,因为我使用的是pd.to_numeric,但我仍然想比较"RMDS"中的"qrtr"one_answers"Mstar"中的"mnthly">
我有什么办法可以处理这种情况吗。
使用pd.to_numeric
来转换您可以转换的内容,然后使用.fillna
来取回未转换的所有内容。
import pandas as pd
import numpy as np
df = np.round(df.apply(pd.to_numeric, errors='coerce'),2).fillna(df)
# RMDS Mstar
#0 10.69 10.69
#1 NYSE_XNAS NYSE_XNAS
#2 0.47 0.47
#3 qrtr mnthly
df.RMDS == df.Mstar
#0 True
#1 True
#2 True
#3 False
#dtype: bool
或者,定义自己的函数并使用.applymap
def my_round(x):
try:
return np.round(float(x),2)
except ValueError:
return x
df = df.applymap(my_round)