在pandas数据帧中,dtype=object的列实际上可以包含混合类型的项,例如整数和字符串。
在本例中,列a是dtype对象,但第一项是字符串,而其他所有项都是int:
import numpy as np, pandas as pd
df=pd.DataFrame()
df['a']=np.arange(0,9)
df.iloc[0,0]='test'
print(df.dtypes)
print(type(df.iloc[0,0]))
print(type(df.iloc[1,0]))
我的问题是:有没有一种快速的方法来识别哪些dtype=object的列实际上包含了像上面这样的混合类型由于panda没有dtype=str,这一点还不明显。
然而,我遇到过这样的情况,在将一个大的csv文件导入panda时,我会收到这样的警告:
sys:1: DtypeWarning: Columns (15,16) have mixed types. Specify dtype option on import or set low_memory=False
有没有一种简单的方法可以复制它并显式列出混合类型的列?或者,我必须手动逐一检查它们,看看是否可以将它们转换为字符串,等等?
背景是我正在尝试使用dataframe.to_SQL和SQLAlchemy将数据帧导出到Microsoft SQL Server。我有
OverflowError: int too big to convert
但是我的数据帧不包含dtype-int-onlyobject和float64的列。我猜这是因为其中一个对象列必须同时包含字符串和整数。
设置
df = pd.DataFrame(np.ones((3, 3)), columns=list('WXY')).assign(Z='c')
df.iloc[0, 0] = 'a'
df.iloc[1, 2] = 'b'
df
W X Y Z
0 a 1.0 1 c
1 1 1.0 b c
2 1 1.0 1 c
解决方案
查找所有类型并计算每列的唯一类型数。
df.loc[:, df.applymap(type).nunique().gt(1)]
W Y
0 a 1
1 1 b
2 1 1