import pandas as pd
df = pd.DataFrame({'RMDS': ['10.686000','NYSE_XNAS','0.472590','qrtr'], 'Mstar': ['10.690000', 'NYSE_XNAS', '0.473590','mnthly']})
Dataframe df如下所示:
Mstar RMDS
0 10.690000 10.686000
1 NYSE_XNAS NYSE_XNAS
2 0.473590 0.472590
3 mnthly qrtr
我想将'RMDS'的值与'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'与'mnthly'进行比较'Mstar'
有什么办法可以处理这种情况?
答案 0 :(得分:1)
使用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)