在进行数据分析时,有时候我们需要对比两份数据是否一致,如果不一致,提取不一致的数据记录;对于结构化的数据来说,我们可以利用pandas的DataFrame数据结构来实现这一点。
我们先将结构化数据文件读入成DataFrame,然后再利用DataFrame的isin函数来实现。这里对于isin函数要注意的有以下几点:
1、isin(values)函数中,如果values是一个DataFrame,则df1.isin(df2)语句中,对df1的每个元素进行判断时,同时会连同该元素对应的index和column一起判断,只有同时符合,才会返回True,不然就是False;
2、如果values是一个Series,则对df1中的每个元素进行判断时,会连同index一起判断,这时column就不会加入判断了,同样的,只有元素值和对应的index都在df2中,才会返回True,不然False;
3、如果values是不带索引的可迭代对象,比如list,那么这时就只会对元素的值进行判断,只要df1中对应的元素值在list中,那么该元素对应的位置就会返回True,不然False。
具体的每种情况的使用和结果可以看下面的代码和结果示例。
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','x','y'])
df2=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
df1
Out:
a b x y
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df2
Out:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
# values为DataFrame
df1.isin(df2)
Out:
a b x y
0 True True False False
1 True True False False
2 True True False False
df2=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'],index=[0,1,5])
df2
Out:
a b c d
0 0 1 2 3
1 4 5 6 7
5 8 9 10 11
df1.isin(df2)
Out:
a b x y
0 True True False False
1 True True False False
2 False False False False
# values为Series
s=pd.Series([1,2,3,4,5])
df1.isin(s)
Out:
a b x y
0 False True False False
1 False False False False
2 False False False False
# values为list
l=[1,2,3,4,5]
df1.isin(l)
Out:
a b x y
0 False True True True
1 True True False False
2 False False False False
最后,得到上述的bool值的DataFrame后,可以用如下代码提取行记录存在不一致的数据。即不完全一致的数据。
df_bool=df1.isin(df2)
df_inconsistent=df1[~df_bool.all(axis=1)]
在使用isin函数的时候,有一个需要注意的点是,df1.isin(values)中,当values为DataFrame和Series时,其index和columns都必须唯一,不然会抛出ValueError异常,这点需要特别注意。