问题:要处理其他api推送的字典(每次都是全部字典推送),业务只关心发生变化的字典项,需要获取变化的字典项

开发环境: python==3.6.5, pandas==0.24.2, macOX, pycharm

pandas.DataFrame数据帧特点

  • 潜在的列是不同的类型
  • 大小可变
  • 标记轴(行和列)
  • 可以对行和列执行算术运算

三个消息字典

msg1
{
    "name":"某矿石",
    "SiO2":"87",
    "Fe2O3":"79",
    "Al2O3":""
}
msg2
{
    "name":"某矿石",
    "SiO2":"87",
    "Fe2O3":"79",
    "Al2O3":"240"
}
msg3
{
    "name":"某矿石",
    "SiO2":"94",
    "Fe2O3":"79",
    "Al2O3":"240"
}

消息2与消息1对比差异

>>> import sys; print('Python %s on %s' % (sys.version, sys.platform))
Python 3.6.5 (default, May 22 2018, 11:08:48)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
>>> import pandas as pd
>>> msg1={"name":"某矿石", "SiO2":87, "Fe2O3":"79", "Al2O3":""}
··· msg2={"name":"某矿石", "SiO2":87, "Fe2O3":"79", "Al2O3":"240"}
··· msg3={"name":"某矿石", "SiO2":94, "Fe2O3":"79", "Al2O3":"240"}
··· df1 = pd.DataFrame.from_dict([msg1])
··· df2 = pd.DataFrame.from_dict([msg2])
··· df3 = pd.DataFrame.from_dict([msg3])
>>> df1
  Al2O3 Fe2O3  SiO2 name
0          79    87  某矿石
>>> df2
  Al2O3 Fe2O3  SiO2 name
0   240    79    87  某矿石
>>> df3
  Al2O3 Fe2O3  SiO2 name
0   240    79    94  某矿石
>>> pd.concat([df1.T, df2.T])  # 转置然后拼接,得到一列多行二维数据
         0
Al2O3     
Fe2O3   79
SiO2    87
name   某矿石
Al2O3  240
Fe2O3   79
SiO2    87
name   某矿石
>>> pd.concat([df1.T, df2.T]).drop_duplicates(keep=False) # 行删除重复,得到差异数据
         0
Al2O3     
Al2O3  240

结论:消息2把字典项数据Al2O3由空修改为240


消息3与消息1对比差异

>>> pd.concat([df1.T, df3.T]).drop_duplicates(keep=False)
         0
Al2O3     
SiO2    87
Al2O3  240
SiO2    94

结论:消息3把字典数据Al2O3由空修改为240,把SiO287修改为94


消息3与消息2对比差异

>>> pd.concat([df2.T, df3.T]).drop_duplicates(keep=False)
       0
SiO2  87
SiO2  94

结论:消息3把字典数据SiO287修改为94


消息3与消息2对比差异,只保留消息3中的数据

>>> pd.concat([df3.T, df2.T, df2.T]).drop_duplicates(keep=False) 
# df2拼接了两次,df2里的数据项都会因为重复被删除,
# 同时df3中与df2相同的数据项也会因重复被删除, df3中差异数据项无重复被保留
       0
SiO2  94

结论:消息3把字典数据SiO2修改为94,此时就可以用SiO2的94新值进行后续的业务处理了。