假设我有一个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()
无效。他们的田地长度都一样。
如何让它发挥作用?
答案 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