首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解为什么drop.duplicates()不起作用

理解为什么drop.duplicates()不起作用
EN

Stack Overflow用户
提问于 2018-06-05 02:48:07
回答 1查看 5K关注 0票数 3

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

代码语言:javascript
复制
             TransID     rev    offer         qs   lt         chan  
212    RTSO118981094  737.24  ABCXCS           3  d382        O78   
53311  RTSO118981094  737.24  ABCXCS           3  d382        O78   

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

这两行看起来是一样的,当我做"diff“时,没有输出。即便如此,

代码语言:javascript
复制
df = df.drop_duplicates() 

没有任何效果。它们的字段长度都是一样的。

如何让它正常工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 03:09:56

好吧,在这种情况下,问题是你的混合类型。调查数据的常用方法是使用导出数据,例如to_dict()

代码语言:javascript
复制
df.to_dict()

另请考虑下面的示例:

代码语言:javascript
复制
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

返回:

代码语言:javascript
复制
df1               df2               df3
a     int64       a    object       a    object
b    object       b    object       b    object
dtype: object     dtype: object     dtype: object  

进一步探索:中的对象类型可以包含不同的类型。这可能会造成一个棘手的情况,我们混合整数,列表,类...随便你怎么说。

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

代码语言:javascript
复制
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'>

最后,让我们创建一个遍历所有对象列并检查是否正确的函数。这是由每列中一组值的长度定义的。在“正确”列中,所有元素的类型都应该相同:

代码语言:javascript
复制
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

在您的案例中:

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50686970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档