熊猫:如何用dtype对象识别列但是混合类型的项目?

Pyt*_*ous 2 python sqlalchemy dataframe pandas

在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]))
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有一种快速的方法来识别dtype = object包含哪些列,实际上是上面的混合类型?由于pandas没有dtype = str,因此不会立即显现出来.

但是,我遇到过将大型csv文件导入pandas的情况,我会收到如下警告:

sys:1: DtypeWarning: Columns (15,16) have mixed types. Specify dtype option on import or set low_memory=False
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法来复制它并明确列出具有混合类型的列?或者我是否需要手动逐个浏览它们,看看我是否可以将它们转换为字符串等?

背景是我正在尝试使用DataFrame.to_sql和SQLAlchemy将数据框导出到Microsoft SQL Server.我得到了

OverflowError: int too big to convert
Run Code Online (Sandbox Code Playgroud)

但我的数据帧不包含dtype int的列 - 只有object和float64.我猜这是因为其中一个对象列必须同时包含字符串和整数.

谢谢!

piR*_*red 6

建立

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
Run Code Online (Sandbox Code Playgroud)

解决方案
查找所有类型并计算每列的唯一数量.

df.loc[:, df.applymap(type).nunique().gt(1)]

   W  Y
0  a  1
1  1  b
2  1  1
Run Code Online (Sandbox Code Playgroud)