比较两个数据帧并处理与 NaN 的比较

Compare two dataframes and handle comparison with NaN

提问人:teq508 提问时间:10/28/2023 最后编辑:teq508 更新时间:10/28/2023 访问量:29

问:

想象一下,您有两个数据帧。 两者都有一个值完全相同的列“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]})
python pandas 数据帧 numpy nan

评论


答:

1赞 Timeless 10/28/2023 #1

您可以合并两个 dfs,然后更新今天的值,如果值不同并且两个值都不同:dateNaN

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
好的,解决方案是合适的。您还有其他想法如何在不合并的情况下执行此操作吗?