比较数据框中具有不一致类型值的列

时间:2018-11-19 14:32:01

标签: python pandas dataframe

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'

有什么办法可以处理这种情况?

1 个答案:

答案 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)