了解drop.duplicates()无效的原因

时间:2018-06-04 18:48:07

标签: python pandas

假设我有一个2行的pandas数据帧,我是通过对较大的数据帧进行子集化而获得的。

             TransID     rev    offer         qs   lt         chan  
212    RTSO118981094  737.24  ABCXCS           3  d382        O78   
53311  RTSO118981094  737.24  ABCXCS           3  d382        O78   

rev是一个已经四舍五入到小数点后两位的浮点数。

两行看起来完全相同,当我做一个"差异"没有输出。即便如此,

df = df.drop_duplicates() 

无效。他们的田地长度都一样。

如何让它发挥作用?

1 个答案:

答案 0 :(得分:3)

在这种情况下,问题是您拥有的混合类型。调查数据的常用方法是将其导出,例如to_dict()

df.to_dict()

还要考虑这个例子:

import pandas as pd

df1 = pd.DataFrame({
    'a': [3,3],
    'b': ["d382","d382"]
})

df2 = pd.DataFrame({
    'a': ['3',3],
    'b': ["d382","d382"]
})

df3 = pd.DataFrame({
    'a': ['3','3'],
    'b': ["d382","d382"]
})

print(df1.dtypes) # <-- Use dtypes to reveal what data types your columns hold
print(df2.dtypes) # <-- Use dtypes to reveal what data types your columns hold
print(df3.dtypes) # <-- Use dtypes to reveal what data types your columns hold

返回:

df1               df2               df3
a     int64       a    object       a    object
b    object       b    object       b    object
dtype: object     dtype: object     dtype: object  

进一步探索:在pandas中,对象类型可以包含不同的类型。这可以创建一个棘手的情况,我们混合整数,列表,类......你的名字。

现在让我们只选择那些列并使用applymap(type)找出每个单元格中的类型。查看上面的示例,错误的数据帧是df2,其中a列包含不同类型的对象。

print(df1.select_dtypes(include=['object']).applymap(type))
print(df2.select_dtypes(include=['object']).applymap(type))
print(df3.select_dtypes(include=['object']).applymap(type))

               b
0  <class 'str'>
1  <class 'str'>
               a              b
0  <class 'str'>  <class 'str'>       # <--- look at column a
1  <class 'int'>  <class 'str'>       # <--- it has mixed types
               a              b
0  <class 'str'>  <class 'str'>
1  <class 'str'>  <class 'str'>

最后,让我们现在创建一个遍历所有对象列并检查一切是否正确的函数。这由每列中的值集的长度定义。在&#34;更正&#34; 列中,所有元素都应为相同类型:

def check_obj_columns(dfx):
    tdf = dfx.select_dtypes(include=['object']).applymap(type)
    for col in tdf:
        if len(set(tdf[col].values)) > 1:
            print("Column {} has mixed object types.".format(col))

check_obj_columns(df1) # Returns nothing
check_obj_columns(df2) # Returns: Column a has mixed object types.
check_obj_columns(df3) # Returns nothing

这意味着df2的对象列a具有混合类型。

在你的情况下:

TransID     object
rev        float64
offer       object
qs          object   # <-- this element here is an object if you got mixed types
lt          object
chan        object
dtype: object