Python 比较表中的十进制列值时出现问题

Python 比较表中的十进制列值时出现问题,python,pandas,numpy,floating-point,Python,Pandas,Numpy,Floating Point,我有下面两列的dataframe,两列的dtypes:object TYP T_TYP 0 181.23876781111 181.23876751111 1 273.98111182222 273.98111182222 2 123456575765776 889.53543543444 3 343.56TUUY87888 646546545454555 4 CGDYTFYFYHGC 455.YTTFGCFTTCT 5 0.0

我有下面两列的dataframe,两列的dtypes:object

    TYP             T_TYP
0   181.23876781111 181.23876751111
1   273.98111182222 273.98111182222
2   123456575765776 889.53543543444
3   343.56TUUY87888 646546545454555
4   CGDYTFYFYHGC    455.YTTFGCFTTCT
5   0.0             123.5646546
6   local           68.46
7   TNT005          908
首先,我使用正则表达式检查两列的数据是否都应为十进制格式,所有数字是否应为十进制格式

exp = '^(\d+\.)+\d+$'
df['match'] = df['TYP'].str.match(exp) & df['T_TYP'].str.match(exp)
df
我的结果数据帧如下所示

    TYP             T_TYP           match
0   181.23876781111 181.23876751111 True
1   273.98111182222 273.98111182222 True
2   123456575765776 889.53543543444 False
3   343.56TUUY87888 646546545454555 False
4   CGDYTFYFYHGC    455.YTTFGCFTTCT False
5   0.0             123.5646546     True
6   local           68.46           False
7   TNT005          908             False
在dataframe上,我需要检查match列的值是否为True,然后对该行比较列TYP和T_TYP的值。数值的整部分应匹配,小数部分应匹配到小数点后6位。如果小数点后第7位不匹配,则显示为不匹配。我尝试了numpy where方法,但它总是给我错误,说**TypeError:can not multiply sequence by non int of type'float'**。我不明白为什么会这样


在这个问题上请求一些帮助。

我会这样做:

df['output'] = (pd.to_numeric(df['TYP'], errors='coerce')
   .sub(pd.to_numeric(df['T_TYP'], errors='coerce'))
   .abs()<1e-6
)

您的预期输出是什么?@piRSquared我认为
匹配
列已经包含了提供的代码。我想OP想把数字比较到小数点后第六位,但不能完全确定。@QuangHoang。。。我们可以再添加一列,如果两列的值在小数点后第7位不匹配,则该列为TrueFalse@piRSquared....compare在匹配列中具有True值的行的列值,否则忽略。
df['diff']=None
(df.loc[df.match==True,'diff']=df[match==True]['TYP'].astype('float64')-df[match==True]['T_TYPE].astype('float64')).abs()
。然后
df[df.diff由于
apply
应用于每列的函数(默认情况下),您可以使用它来应用
pd.to_numeric
,而无需通常的
apply
羞耻(:
df.to_numeric,errors='强制')。管道(lambda:np.isclose(d['TYP']),d['T TYP'])
它的粗略版本是
np.isclose(*映射(df.apply(pd.to\u numeric,errors='concurve').get,df))
Perfect..让我试试这个。谢谢。@Quang Hoang…你给出的解决方案对我很有效,但我正在努力理解它到底在做什么。你能帮我理解一下吗?@sac
pd。要将列转换为数字,请在不是数字的地方标记
nan
(相当于您的
.str.match
)。然后将这两个数字列与
1e-6=0.000001
的阈值进行比较,也就是说,如果差值小于1e-6,则为匹配;这两个数字匹配到第6位小数。
               TYP            T_TYP  output
0  181.23876781111  181.23876751111    True
1  273.98111182222  273.98111182222    True
2  123456575765776  889.53543543444   False
3  343.56TUUY87888  646546545454555   False
4     CGDYTFYFYHGC  455.YTTFGCFTTCT   False
5              0.0      123.5646546   False
6            local            68.46   False
7           TNT005              908   False