【问题标题】:Converting a column within pandas dataframe from int to string将 pandas 数据框中的列从 int 转换为 string
【发布时间】:2013-07-30 19:08:35
【问题描述】:

我在 pandas 中有一个混合了 int 和 str 数据列的数据框。我想首先连接数据框中的列。为此,我必须将int 列转换为str。 我尝试过如下操作:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

mtrx['X.3'] = mtrx['X.3'].astype(str)

但在这两种情况下它都不起作用,并且我收到一条错误消息,提示“无法连接 'str' 和 'int' 对象”。连接两个 str 列可以正常工作。

【问题讨论】:

标签: python string pandas dataframe int


【解决方案1】:
In [16]: df = DataFrame(np.arange(10).reshape(5,2),columns=list('AB'))

In [17]: df
Out[17]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [18]: df.dtypes
Out[18]: 
A    int64
B    int64
dtype: object

转换一个系列

In [19]: df['A'].apply(str)
Out[19]: 
0    0
1    2
2    4
3    6
4    8
Name: A, dtype: object

In [20]: df['A'].apply(str)[0]
Out[20]: '0'

别忘了把结果赋值回去:

df['A'] = df['A'].apply(str)

转换整个帧

In [21]: df.applymap(str)
Out[21]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [22]: df.applymap(str).iloc[0,0]
Out[22]: '0'

df = df.applymap(str)

【讨论】:

  • 我真的不明白为什么,但是 mtrx['X.3'].apply(str) 对我也不起作用:( dtype 仍然显示 int64。23177 行和 X 的数据框.3 列只有数字。在 [21]: mtrx['X.3'].dtype Out[21]: dtype('int64')
  • 0.7.0,Ubuntu系统自带python 2.7
  • 当前版本为0.12,请升级。
  • df['A'].apply(str) 不起作用。但 df.column_name = df.column_name.astype(str) 有效。不知道为什么。
  • @DmitryKonovalov 在 python 字符串中是不可变的,因此无论何时操作数据,都必须将结果放回变量中。
【解决方案2】:

改变DataFrame列的数据类型:

到int:

df.column_name = df.column_name.astype(np.int64)

到str:

df.column_name = df.column_name.astype(str)

【讨论】:

  • 这很吸引人,但在我使用pd.Series(np.arange(1000000)) 的测试中,它比@Jeff 的apply(str) 慢4 倍。
  • 这对我有用。 df['A'] = df['A'].apply(str) 也有效。 @Jeff 提供的答案对我不起作用。
  • 关于@JohnZwinck 的评论,使用 Python3 使用 apply() 而不是 astype() 似乎快 2 倍:timeit.Timer('c.apply(str)', setup= 'import pandas as pd; c = pd.Series(range(1000))').timeit(1000) >>> 0.41499893204309046 >>> timeit.Timer('c.astype(str)', setup='import pandas as pd; c = pd.Series(range(1000))').timeit(1000) 0.8004439630312845
【解决方案3】:

警告:给出 ( astype() 和 apply() ) 的两种解决方案都不会在 nan 或 None 中保留 NULL 值表格。

import pandas as pd
import numpy as np

df = pd.DataFrame([None,'string',np.nan,42], index=[0,1,2,3], columns=['A'])

df1 = df['A'].astype(str)
df2 =  df['A'].apply(str)

print df.isnull()
print df1.isnull()
print df2.isnull()

我相信这可以通过to_string() 的实现来解决

【讨论】:

  • to_string 允许您选择对 Nan 的处理,例如返回空字符串而不是 'Nan'
  • (我没有不同意,只是在扩展你所说的)——本来想说+1
【解决方案4】:

使用以下代码:

df.column_name = df.column_name.astype('str')

【讨论】:

    【解决方案5】:

    仅供参考。

    以上所有答案都适用于数据框。但是,如果您在创建/修改列时使用 lambda,则其他人的上述答案将不起作用,因为它被视为 int 属性而不是 pandas 系列。您必须使用 str( target_attribute ) 将其作为字符串。请参考以下示例。

    def add_zero_in_prefix(df):
        if(df['Hour']<10):
            return '0' + str(df['Hour'])
    
    data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)
    

    【讨论】:

      【解决方案6】:

      列转字符串有四种方式

      1. astype(str)
      df['column_name'] = df['column_name'].astype(str)
      
      2. values.astype(str)
      df['column_name'] = df['column_name'].values.astype(str)
      
      3. map(str)
      df['column_name'] = df['column_name'].map(str)
      
      4. apply(str)
      df['column_name'] = df['column_name'].apply(str)
      

      让我们看看每种类型的性能

      #importing libraries
      import numpy as np
      import pandas as pd
      import time
      
      #creating four sample dataframes using dummy data
      df1 = pd.DataFrame(np.random.randint(1, 1000, size =(10000000, 1)), columns =['A'])
      df2 = pd.DataFrame(np.random.randint(1, 1000, size =(10000000, 1)), columns =['A'])
      df3 = pd.DataFrame(np.random.randint(1, 1000, size =(10000000, 1)), columns =['A'])
      df4 = pd.DataFrame(np.random.randint(1, 1000, size =(10000000, 1)), columns =['A'])
      
      #applying astype(str)
      time1 = time.time()
      df1['A'] = df1['A'].astype(str)
      print('time taken for astype(str) : ' + str(time.time()-time1) + ' seconds')
      
      #applying values.astype(str)
      time2 = time.time()
      df2['A'] = df2['A'].values.astype(str)
      print('time taken for values.astype(str) : ' + str(time.time()-time2) + ' seconds')
      
      #applying map(str)
      time3 = time.time()
      df3['A'] = df3['A'].map(str)
      print('time taken for map(str) : ' + str(time.time()-time3) + ' seconds')
      
      #applying apply(str)
      time4 = time.time()
      df4['A'] = df4['A'].apply(str)
      print('time taken for apply(str) : ' + str(time.time()-time4) + ' seconds')
      

      输出

      time taken for astype(str): 5.472359895706177 seconds
      time taken for values.astype(str): 6.5844292640686035 seconds
      time taken for map(str): 2.3686647415161133 seconds
      time taken for apply(str): 2.39758563041687 seconds
      

      如果您多次跑步,每种技术的时间可能会有所不同。 与其余两种技术相比, map(str)apply(str) 平均花费更少的时间

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 2017-07-29
        • 1970-01-01
        • 2020-02-17
        • 2018-03-08
        • 1970-01-01
        • 2018-03-25
        • 1970-01-01
        相关资源
        最近更新 更多