【问题标题】:Pandas: change data type of Series to String熊猫:将系列的数据类型更改为字符串
【发布时间】:2014-04-09 12:12:07
【问题描述】:

我在 Python 2.7 中使用 Pandas 'ver 0.12.0' 并有如下数据框:

df = pd.DataFrame({'id' : [123,512,'zhub1', 12354.3, 129, 753, 295, 610],
                    'colour': ['black', 'white','white','white',
                            'black', 'black', 'white', 'white'],
                    'shape': ['round', 'triangular', 'triangular','triangular','square',
                                        'triangular','round','triangular']
                    },  columns= ['id','colour', 'shape'])

id 系列由一些整数和字符串组成。它的dtype 默认为object。我想将id 的所有内容转换为字符串。我试过astype(str),它会产生下面的输出。

df['id'].astype(str)
0    1
1    5
2    z
3    1
4    1
5    7
6    2
7    6

1) 如何将id 的所有元素转换为字符串?

2) 我最终将使用id 为数据帧建立索引。与使用整数索引相比,在数据帧中使用字符串索引会减慢速度吗?

【问题讨论】:

  • 不知道为什么你会得到那个输出,因为astype 对我来说很好,至少在 0.13.1 版本中,也许 0.12.0 有一个错误?在回答您的第二点时,是的,它可能会更慢,因为字符串比较不会比整数比较快,但我会先分析一下,这也取决于大小
  • 您已经设置了列,对吧? df['id'] = df['id'].astype(str)
  • @Andy Hayden,是的,我预约了,但这是我认为出乎意料的输出。
  • 以什么方式出乎意料?
  • 它只返回每个系列元素的第一个字符,正如我在df['id'].astype(str) 下的问题中提出的那样

标签: python pandas series


【解决方案1】:

使用 pandas 字符串方法,即df['id'].str.cat()

【讨论】:

    【解决方案2】:

    对我来说 .to_string() 有效

    df['id']=df['id'].to_string()
    

    【讨论】:

      【解决方案3】:

      有两种可能:

      【讨论】:

        【解决方案4】:

        反映最新实践的新答案:截至目前 (v1.2.4),astype('str')astype(str) 都不起作用。

        As per the documentation,可以通过以下方式将Series转换为字符串数据类型:

        df['id'] = df['id'].astype("string")
        
        df['id'] = pandas.Series(df['id'], dtype="string")
        
        df['id'] = pandas.Series(df['id'], dtype=pandas.StringDtype)
        

        【讨论】:

        • 这需要在此类问题的搜索结果中获得更高的排名。我尝试的其他一切都来自过时的建议!谢谢!
        • @LizZ 很高兴!我的答案相对较新,但我认为它最终会达到顶峰。
        • 此解决方案有效,而其他解决方案无效。这应该作为公认的答案!
        【解决方案5】:

        对我来说它有效:

         df['id'].convert_dtypes()
        

        在此处查看文档:

        https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html

        【讨论】:

          【解决方案6】:

          您的问题可以通过先转换为对象来轻松解决。转成object后,用"astype"转成str即可。

          obj = lambda x:x[1:]
          df['id']=df['id'].apply(obj).astype('str')
          

          【讨论】:

            【解决方案7】:

            你可以使用:

            df.loc[:,'id'] = df.loc[:, 'id'].astype(str)
            

            这就是他们推荐此解决方案的原因:Pandas doc

            TD;LR

            反映一些答案:

            df['id'] = df['id'].astype("string")
            

            这将在给定示例中中断,因为它将尝试转换为无法处理“字符串”中的任何数字的StringArray

            df['id']= df['id'].astype(str)
            

            对我来说,这个解决方案会引发一些警告:

            > SettingWithCopyWarning:  
            > A value is trying to be set on a copy of a
            > slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
            

            【讨论】:

              【解决方案8】:

              就我个人而言,上述方法都不适合我。 做了什么:

              new_str = [str(x) for x in old_obj][0]
              

              【讨论】:

                【解决方案9】:

                你必须像这样分配它:-

                df['id']= df['id'].astype(str)
                

                【讨论】:

                  【解决方案10】:

                  您可以使用apply将id的所有元素转换为str

                  df.id.apply(str)
                  
                  0        123
                  1        512
                  2      zhub1
                  3    12354.3
                  4        129
                  5        753
                  6        295
                  7        610
                  

                  由 OP 编辑​​:

                  我认为这个问题与 Python 版本(2.7.)有关,这有效:

                  df['id'].astype(basestring)
                  0        123
                  1        512
                  2      zhub1
                  3    12354.3
                  4        129
                  5        753
                  6        295
                  7        610
                  Name: id, dtype: object
                  

                  【讨论】:

                  • 谢谢,我会在电脑旁边试试这个并接受你的回答。你知道为什么astype(str ) 不起作用吗?
                  • @Zhubarb - 我刚试过,我得到了与df['id'].astype(str)相同的结果
                  • 与我发布的相同结果(不想要的)还是您使用df.id.apply(str) 得到的结果(想要的)?
                  • 我认为应该是.astype('str')而不是.astype(str)
                  • @ErnestSKirubakaran - 阅读之前的评论,试试.astype('str')
                  猜你喜欢
                  • 2022-01-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-11-23
                  • 1970-01-01
                  • 2018-11-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多