【问题标题】:Find changed rows (subset of rows) in two dataframes在两个数据框中查找更改的行(行的子集)
【发布时间】:2017-01-18 12:12:34
【问题描述】:

我每天收到 2 个包含 2 列的 csv 文件。一个具有唯一标识符,另一个具有值。我正在尝试比较每个标识符的值并保留值已更改的那些行。

Id1        Value_today
abc        500
def        600
ghi        700
jkl        800

Id1        Value_Yesterday
abc        500
def        650
ghi        750
jkl        800
mno        900

想要的输出是

Id1        Value
def        650
ghi        750
mno        900

到目前为止我已经尝试过:

df4 = df1.merge(df2,how='outer',on='Id1')
df4['check']=df4.Value_today==df4.Value_Yesterday
df4 = df4[df4['check'] == False]

但这会返回一个空数据框。 我做错了吗?

【问题讨论】:

    标签: python pandas dataframe compare


    【解决方案1】:

    我会这样做:

    In [11]: d1
    Out[11]:
       Id1  Value
    0  abc    500
    1  def    600
    2  ghi    700
    3  jkl    800
    
    In [12]: d2
    Out[12]:
       Id1  Value
    0  abc    500
    1  def    650
    2  ghi    750
    3  jkl    800
    4  mno    900
    
    In [13]: %paste
    r = pd.concat([d1.assign(x='old'), d2.assign(x='new')], ignore_index=True) \
          .drop_duplicates(subset=['Id1','Value'], keep=False) \
          .set_index(['Id1','x']) \
          .unstack() \
          .reset_index()
    r.columns = [col[1] if col[1] else col[0] for col in r.columns]
    ## -- End pasted text --
    

    结果:

    In [16]: r
    Out[16]:
       Id1    new    old
    0  def  650.0  600.0
    1  ghi  750.0  700.0
    2  mno  900.0    NaN
    
    In [17]: r[['Id1','old','new']]
    Out[17]:
       Id1    old    new
    0  def  600.0  650.0
    1  ghi  700.0  750.0
    2  mno    NaN  900.0
    

    更通用的情况(多列):

    In [27]: d1
    Out[27]:
       ID  a  b  c
    0   1  1  2  3
    1   2  4  5  6
    2   3  7  8  9
    
    In [28]: d2
    Out[28]:
       ID  a  b   c
    0   1  1  2   3
    1   2  4  0   6
    2   3  7  8  10
    3   4  1  1   1
    
    In [29]: %paste
    r = pd.concat([d1.assign(x='old'), d2.assign(x='new')], ignore_index=True) \
          .drop_duplicates(subset=d1.columns.tolist(), keep=False) \
          .set_index(['ID','x']) \
          .unstack() \
          .reset_index()
    ## -- End pasted text --
    
    In [30]: r
    Out[30]:
      ID    a         b          c
    x     new  old  new  old   new  old
    0  2  4.0  4.0  0.0  5.0   6.0  6.0
    1  3  7.0  7.0  8.0  8.0  10.0  9.0
    2  4  1.0  NaN  1.0  NaN   1.0  NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2013-03-07
      • 2023-04-02
      • 2019-12-01
      • 2021-08-18
      • 2015-08-05
      相关资源
      最近更新 更多