【问题标题】:Pandas: Cast column to string does not work熊猫:将列转换为字符串不起作用
【发布时间】:2017-07-29 02:13:43
【问题描述】:

我有一个数据框resultstatsDF

resultstatsDF = DataFrame({'a': [1,2,3,4,5]})
resultstatsDF['file'] = 'asdf'
resultstatsDF.dtypes
a        int64
file    object
dtype: object

我想将 objectfile 转换为字符串:

我试过了

resultstatsDF = resultstatsDF.astype({'file': str})
resultstatsDF['file'] = resultstatsDF['file'].astype(str)
resultstatsDF['file'] = resultstatsDF['file'].to_string
resultstatsDF['file'] = resultstatsDF.file.apply(str)
resultstatsDF['file'] = resultstatsDF['file'].apply(str)

但无论我做什么,当我检查时

resultstatsDF.dtypes

file 列保持为 tpye object

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    stringdictlistdtype 始终为object,为了测试type,需要选择列的一些值,例如iat:

    type(resultstatsDF['file'].iat[0])
    

    示例:

    resultstatsDF = pd.DataFrame({'file':['a','d','f']})
    print (resultstatsDF)
      file
    0    a
    1    d
    2    f
    
    print (type(resultstatsDF['file'].iloc[0]))
    <class 'str'>
    
    print (resultstatsDF['file'].apply(type))
    0    <class 'str'>
    1    <class 'str'>
    2    <class 'str'>
    Name: file, dtype: object
    

    示例:

    df = pd.DataFrame({'strings':['a','d','f'],
                       'dicts':[{'a':4}, {'c':8}, {'e':9}],
                       'lists':[[4,8],[7,8],[3]],
                       'tuples':[(4,8),(7,8),(3,)],
                       'sets':[set([1,8]), set([7,3]), set([0,1])] })
    
    print (df)
          dicts   lists    sets strings  tuples
    0  {'a': 4}  [4, 8]  {8, 1}       a  (4, 8)
    1  {'c': 8}  [7, 8]  {3, 7}       d  (7, 8)
    2  {'e': 9}     [3]  {0, 1}       f    (3,)
    

    所有值都具有相同的dtypes:

    print (df.dtypes)
    dicts      object
    lists      object
    sets       object
    strings    object
    tuples     object
    dtype: object
    

    type不一样,如果需要循环检查:

    for col in df:
        print (df[col].apply(type))
    
    0    <class 'dict'>
    1    <class 'dict'>
    2    <class 'dict'>
    Name: dicts, dtype: object
    0    <class 'list'>
    1    <class 'list'>
    2    <class 'list'>
    Name: lists, dtype: object
    0    <class 'set'>
    1    <class 'set'>
    2    <class 'set'>
    Name: sets, dtype: object
    0    <class 'str'>
    1    <class 'str'>
    2    <class 'str'>
    Name: strings, dtype: object
    0    <class 'tuple'>
    1    <class 'tuple'>
    2    <class 'tuple'>
    Name: tuples, dtype: object
    

    或列的第一个值:

    print (type(df['strings'].iat[0]))
    <class 'str'>
    
    print (type(df['dicts'].iat[0]))
    <class 'dict'>
    
    print (type(df['lists'].iat[0]))
    <class 'list'>
    
    print (type(df['tuples'].iat[0]))
    <class 'tuple'>
    
    print (type(df['sets'].iat[0]))
    <class 'set'>
    

    如果可能,使用boolean indexing 混合列(然后可以破坏一些熊猫功能)可以通过type 过滤:

    df = pd.DataFrame({'mixed':['3', 5, 9,'2']})
    print (df)
      mixed
    0     3
    1     5
    2     9
    3     2
    
    print (df.dtypes)
    mixed    object
    dtype: object
    

    for col in df:
        print (df[col].apply(type))
    0    <class 'str'>
    1    <class 'int'>
    2    <class 'int'>
    3    <class 'str'>
    Name: mixed, dtype: object
    
    #python 3 - string
    #python 2 - basestring
    mask = df['mixed'].apply(lambda x: isinstance(x,str))
    print (mask)
    0     True
    1    False
    2    False
    3     True
    Name: mixed, dtype: bool
    
    df = df[mask]
    print (df)
      mixed
    0     3
    3     2
    

    【讨论】:

    • 那为什么会出现 TypeError 呢? stackoverflow.com/questions/42671168/…
    • 我不知道r,所以我不知道是什么问题
    • 这是 python 不是 R.
    • 嗯,也许没有
    • 显然有问题,因为我得到一个错误。我不明白你的意思。
    猜你喜欢
    • 2018-10-21
    • 2021-09-19
    • 2020-03-22
    • 2018-11-01
    • 2017-07-31
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多