考虑以下输入数据
产品 | 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 知识尝试了这段代码,但没有成功
逻辑:
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 |
两个 | 在途 | 现货 | 不一样 |
任何其他方法请建议
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