Pandas - 在大型Dataframe中的配对列值中发现异常

时间:2017-03-26 20:34:42

标签: python pandas dataframe

我已经将头撞在墙上几个小时了,并且感谢我能得到的任何帮助。

我正在使用大型数据集(超过270,000行),并且我试图在两列中找到应该具有配对值的异常。

从下面输出的片段中 - 我正在查看Alcohol_Category_ID和Alcohol_Category_Name列。 ID列具有数字字符串值,该值应与“名称”列中的字符串描述符以1:1配对。 (例如," 1031100.0" ==" 100 PROOF VODKA"。

如您所见,两列都具有相同的非空值计数。但是,有72个唯一ID,只有71个唯一名称。我认为这意味着一个名称与两个不同的ID错误地关联。

        County  Alcohol_Category_ID  Alcohol_Category_Name   Vendor_Number  \
count   269843              270288                270288        270920   
unique      99                  72                    71           116   
top       Polk           1031080.0        VODKA 80 PROOF           260   
freq     49092               35366                 35366         46825   
first      NaN                 NaN                   NaN           NaN   
last       NaN                 NaN                   NaN           NaN   
mean       NaN                 NaN                   NaN           NaN   
std        NaN                 NaN                   NaN           NaN   
min        NaN                 NaN                   NaN           NaN   
25%        NaN                 NaN                   NaN           NaN   
50%        NaN                 NaN                   NaN           NaN   
75%        NaN                 NaN                   NaN           NaN   
max        NaN                 NaN                   NaN           NaN   

我的麻烦在于实际上隔离了这种重复发生的位置,这样我就可以用正确的值替换错误的ID。我有一条时间的狗。

我的数据框名为i_a。

我一直在尝试使用groupby和count语句检查这两列之间的值对,如下所示:

i_a.groupby(["Alcohol_Category_Name", "Alcohol_Category_ID"]).Alcohol_Category_ID.count()

但是,我不确定如何从那里减少它。并且有太多的配对使这很容易在视觉上做。

有人可以推荐一种方法来隔离与多个Alcohol_Category_ID相关联的Alcohol_Category_Name吗?

非常感谢你的考虑!

编辑:在考虑了德米特里的建议之后,我找到了解决方案,不断对重复进行配对,直到我磨练了感兴趣的价值,如下:

#Finding all unique pairings of Category IDs and Names
subset = i_a.drop_duplicates(["Alcohol_Category_Name", "Alcohol_Category_ID"])

#Now, determine which of the category names appears more than once (thus paired with more than one ID)
subset[subset["Alcohol_Category_Name"].duplicated()]

非常感谢你的帮助。回想起来似乎很明显,但我无法理解我的生活。

1 个答案:

答案 0 :(得分:1)

我认为此代码段符合您的需求:

> df = pd.DataFrame({'a':[1,2,3,1,2,3], 'b':[1,2,1,1,2,1]})

因此df.a有3个唯一值映射到df.b中的2个唯一身份。

> df.groupby('b')['a'].nunique()
b
1    2
2    1

这表明df.b = 1映射到a中的2个uniques(并且df.b = 2映射到只有1)。