问题:要处理其他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
,把SiO2
由87
修改为94
。
消息3与消息2对比差异
>>> pd.concat([df2.T, df3.T]).drop_duplicates(keep=False)
0
SiO2 87
SiO2 94
结论:消息3
把字典数据SiO2
由87
修改为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新值进行后续的业务处理了。