Python 熊猫:如何识别具有dtype对象但具有混合类型项的列?

Python 熊猫:如何识别具有dtype对象但具有混合类型项的列?,python,pandas,dataframe,sqlalchemy,Python,Pandas,Dataframe,Sqlalchemy,在数据帧中,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的列实际上可以包含混合类型的项,例如整数和字符串

在本例中,列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的列实际上包含了上述混合类型?因为pandas没有dtype=str,这一点并不明显

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

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-only object和float64的列。我猜这是因为其中一个对象列必须同时包含字符串和整数。

Setup

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

调用
df.to_sql(…)
时只需使用
dtype
参数,这意味着传递一个将列名映射到数据类型的字典,即将所有对象列映射到字符串。两个疑问:1)在出口之前,它似乎与大熊猫自身转化为str并没有太大区别。2) 对象列还可以包含哪些内容(我不想将其转换为字符串)?我想是约会吧?我不明白有什么问题。SQL DB中不能有混合数据类型(一列),因此您可以自己强制转换值,也可以隐式转换值…piRSquared为您提供了一种识别它们的方法,但是在我看来,指定正确的数据类型比扫描整个DF来查找混合的数据类型要有效得多。我担心您无论如何都必须这样做(假设这些表至少有一个string/varchar列),因为:,。只是想一想,这并不能区分包含所有字符串的列和一些NaN(它们是浮动的),还有一个包含字符串和整数,我真想知道,如果熊猫在处理缺失值方面做得如此糟糕,人们怎么能把它用于数据科学呢!这就像在说“如果在控制出血方面做得这么差,我想知道为什么外科医生会使用手术刀。”不,没有任何关联。价值缺失是生活中的一个事实。处理这些问题对熊猫来说是非常痛苦的,因为在其他工具(如任何数据库)中,同样简单自然的任务需要你经历很多困难。请注意,这并不是熊猫开发者明确决定的结果,而是熊猫是在numpy之上建造的。为什么熊猫群比会移除南?为什么一列整数或字符串不能有空值?为什么空值只能是浮点数?请有人解释一下为什么这一切都有意义@Pythonistaanonymous在pandas中实际上有两种类型的空值:
float('nan')
,和本机python
None
<但是,code>None只能与对象数据类型一起使用。