提问人:teq508 提问时间:10/28/2023 最后编辑:teq508 更新时间:10/28/2023 访问量:29
比较两个数据帧并处理与 NaN 的比较
Compare two dataframes and handle comparison with NaN
问:
想象一下,您有两个数据帧。 两者都有一个值完全相同的列“name”(此处:A、B、C、D)。 现在,应检查相应名称之间的“值”。
import pandas as pd
import numpy as np
import datetime as dt
df_base = pd.DataFrame({
'name': ['A','B','C','D','E'],
'value': ['x', 'y',np.nan,'x',np.nan],
'date': ['01-01-1980','01-01-1980',np.nan,'01-01-1980',np.nan]})
df_upd = pd.DataFrame({
'name': ['A','B','C','D'],
'value': ['x', np.nan,'x','y']})
如果值不同,df_base['date'] 应按表中所示进行更新。x = x 是相同的,应保留在旧值上。np.nan = np.nan 在日期中也有 np.nan,并且应保持不变。所有其他情况应按差异处理,并以当前日期更新。
| name | value (df_base) | value (df_upd) |date (old)| date(new) |
|------|-----------------|----------------|----------|---------------|
| A | x | x |01-01-1980| 01-01-1980 |
| B | y | np.nan |01-01-1980|dt.date.today()|
| C | np.nan | x | np.nan |dt.date.today()|
| D | x | y |01-01-1980|dt.date.today()|
| E | np.nan | np.nan | np.nan | np.nan |
最后,我想要这个:
df_base = pd.DataFrame({
'name': ['A','B','C','D','E'],
'value': ['x', 'y',np.nan,'x',np.nan],
'date': ['01-01-1980','*today*','*today*','*today*',np.nan]})
答:
1赞
Timeless
10/28/2023
#1
您可以合并
两个 dfs,然后更新今天的值,如果值不同并且两个值都不同:date
NaN
cmp = df_base.merge(df_upd, on="name", how="left", suffixes=(None, "_upd"))
# are both values NaN ?
m1 = cmp[["value", "value_upd"]].isna().all(axis=1)
# has the value been updated ?
m2 = cmp["value"].eq(cmp.pop("value_upd"))
cmp["date"] = cmp["date"].where(m1|m2, # or maybe you want %-d-%m-%Y ?
pd.Timestamp("today").strftime("%m-%d-%Y"))
输出:
print(cmp)
name value date
0 A x 01-01-1980
1 B y 10-28-2023
2 C NaN 10-28-2023
3 D x 10-28-2023
4 E NaN NaN
评论
0赞
teq508
10/30/2023
好的,解决方案是合适的。您还有其他想法如何在不合并的情况下执行此操作吗?
评论