Python 熊猫:有没有一种方法可以在不遇到AttributeError的情况下检查对象是否是要使用的字符串.str访问器?

Python 熊猫:有没有一种方法可以在不遇到AttributeError的情况下检查对象是否是要使用的字符串.str访问器?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用toPandas()将pyspark数据帧转换为pandas数据帧。但是,由于某些数据类型不对齐,熊猫会将数据帧中的某些列(如十进制字段)强制转换为对象 我想用实际字符串在我的列上运行.str,但似乎无法让它工作(没有明确地找到要首先转换的列)。我遇到 AttributeError: Can only use .str accessor with string values! 我尝试了df.fillna(0)和df.infere_objects(),但没有成功。我似乎无法将对象注册为

我正在使用toPandas()将pyspark数据帧转换为pandas数据帧。但是,由于某些数据类型不对齐,熊猫会将数据帧中的某些列(如十进制字段)强制转换为对象

我想用实际字符串在我的列上运行
.str
,但似乎无法让它工作(没有明确地找到要首先转换的列)。我遇到

AttributeError: Can only use .str accessor with string values!
我尝试了
df.fillna(0)
df.infere_objects()
,但没有成功。我似乎无法将对象注册为int64或float64,因此无法执行此操作

for col in df.columns: 
    if df[col].dtype == np.object:
        insert logic here 
事先

我也不能使用
.str.contains
,因为即使带有数值的列是dtype对象,使用
.str
时也会出错

(作为参考,我试图做的是,如果数据帧中的列实际上有字符串值,请执行
str.split()

有什么想法吗?请注意,我很想在Pandas方面找到答案,而不必事先明确指出哪些列实际上有字符串。一种可能的解决方案是获取
pyspark
端的字符串列列表,并将其作为要运行
.str
方法的列传递


编辑:
astype(str)
不起作用b/c某些对象是数组。也就是说,如果我想在“\u”上拆分,并且我在一列中有一个数组[Red\u Apple,Orange],那么在该列上执行
astype(str)。str.split
将返回[Red,Apple,Orange],这是没有意义的。我只想拆分字符串列,而不是将数组转换为字符串并拆分它们。

您可以使用
isinstance()


您可以使用
isinstance()


这里有几个想法:

  • 使用以下命令将列转换为字符串:
    df[col\u name].astype(str).str.split()
  • 使用检查列类型,并仅对已为类型
    对象
    的列运行str.split()

  • 这实际上取决于您想如何实现它,但如果您想将该列视为一个
    str
    ,我会选择选项1。

    这里有几个想法:

  • 使用以下命令将列转换为字符串:
    df[col\u name].astype(str).str.split()
  • 使用检查列类型,并仅对已为类型
    对象
    的列运行str.split()

  • 这实际上取决于您想如何实现它,但是如果您想将该列视为一个
    str
    ,那么我会选择选项1。

    希望我的回答是正确的。您可以使用[.选择类型][1]

    df = pd.DataFrame({'A':['9','3','7'],'b':['11.0','8.0','9'], 'c':[2,5,9]})#DataFrame
    print(df.dtypes)#Check df dtypes
    
    
    A    object
    b    object
    c     int64
    dtype: object
    
    df2=df.select_dtypes(include='object')#Isolate object dtype columns
    df3=df.select_dtypes(exclude='object')#Isolate nonobject dtype columns
    df2=df2.astype('float')#Convert object columns to float
    res=df3.join(df2)#Rejoin the datframes
    res.dtypes#Recheck the dtypes
    
    c      int64
    A    float64
    b    float64
    dtype: object
    

    希望我没弄错。您可以使用[.选择类型][1]

    df = pd.DataFrame({'A':['9','3','7'],'b':['11.0','8.0','9'], 'c':[2,5,9]})#DataFrame
    print(df.dtypes)#Check df dtypes
    
    
    A    object
    b    object
    c     int64
    dtype: object
    
    df2=df.select_dtypes(include='object')#Isolate object dtype columns
    df3=df.select_dtypes(exclude='object')#Isolate nonobject dtype columns
    df2=df2.astype('float')#Convert object columns to float
    res=df3.join(df2)#Rejoin the datframes
    res.dtypes#Recheck the dtypes
    
    c      int64
    A    float64
    b    float64
    dtype: object
    

    不确定你在这里试图做什么,但是为什么不把数据用String()L. Chu串起来?@你编辑了什么?@安森抱歉看起来编辑没有通过,这是对CalbCuttne的回答的回应。@ L.Cu考虑接受一个答案。不确定你在这里尝试做什么,但是为什么不把数据用String()串到字符串中呢?“L. Chu,你编辑了什么?”安森抱歉看起来编辑没有通过,这是对Calbuttnne的回答。@ L.Cu考虑接受一个答案。1:我在你回答后不久添加了一个编辑:因为某些对象是数组,所以Atype不能工作。也就是说,如果我想在“”上拆分,并且我有一个数组[Red_Apple,Orange],那么在这个列上执行astype(str)。str.split将返回[Red,Apple,Orange],这没有意义。两个人。在我的例子中,所有数据类型在从Pyspark转换为pandas df时都是数据帧中的对象,因此这也不起作用。对于1:在您回答后不久,我添加了一个编辑:astype将不起作用,因为某些对象是数组。也就是说,如果我想在“”上拆分,并且我有一个数组[Red_Apple,Orange],那么在这个列上执行astype(str)。str.split将返回[Red,Apple,Orange],这没有意义。两个人。在我的例子中,在从Pyspark转换为pandas df时,所有数据类型都是数据帧中的对象,因此这也不起作用。当存在无法转换为float的字符串列时,这也不起作用。例如:'d':['Apple'、'Pear'、'Tree']将在.astype('float')上出错。当存在无法转换为float的字符串列时,这将不起作用。例如:'d':['Apple','Pear','Tree']将在.astype('float')上出错。