Pandas,查找两列之间的差异,每列都有不同的数据类型值

问题描述 投票:0回答:1

考虑以下输入数据

产品 col1 col2
一个 你好
一个 18.0 19.52
一个 2024-02-12 00:00:00 2024-03-07 00:00:00
两个 2024-02-12 00:00:00 2024-02-11 00:00:00
两个 在途 现货

想要找到 col1 和 col2 之间的差异,因为每行的数据类型都有差异,我在应用 pandas 函数时面临困难。使用 SQL 知识尝试了这段代码,但没有成功

逻辑:

  1. 如果 str 那么差异 =“不相同”
  2. 如果日期时间则差值 = (col2-col1).days
  3. 其他差异 = col2 - col1
df["difference"] = np.where( df['col2'].apply(lambda x: isinstance(x, str)), "not same", 
                                df["col2"].apply(lambda x: isinstance(x, datetime)), (df['col2'] - df['col1']).dt.days, 
                                df['old_value'] - df['new_value'])


** 未获得预期输出,日期时间仍处于 timedelta

预期输出:

产品 col1 col2 差异
一个 你好 不一样
一个 18.0 19.52 1.52
一个 2024-02-12 00:00:00 2024-03-07 00:00:00 25
两个 2024-02-12 00:00:00 2024-02-11 00:00:00 1
两个 在途 现货 不一样

任何其他方法请建议

python pandas datetime timedelta
1个回答
0
投票

我认为最可靠的是转换两列

to_numeric
/
to_datetime
并按所需的顺序执行差异/比较:

import numpy as np

cols = ['col1', 'col2']

tmp_num = df[cols].apply(pd.to_numeric, errors='coerce')
tmp_date = df[cols].apply(pd.to_datetime, errors='coerce')

df['difference'] = (
 tmp_num[cols[1]].sub(tmp_num[cols[0]])
 .fillna(tmp_date[cols[1]].sub(tmp_date[cols[0]]).dt.days.abs())
 .fillna(pd.Series(np.where(df[cols[0]].ne(df[cols[1]]), 'not same', np.nan),
                   index=df.index))
)

输出:

  prod                 col1                 col2 difference
0  One                   hi                hello   not same
1  One                 18.0                19.52       1.52
2  One  2024-02-12 00:00:00  2024-03-07 00:00:00       24.0
3  two  2024-02-12 00:00:00  2024-02-11 00:00:00        1.0
4  two           in-transit             in-stock   not same
© www.soinside.com 2019 - 2024. All rights reserved.