将pandas dataframe中的列从int转换为string

Mal*_*fet 89 python string int dataframe pandas

我在pandas中有一个带有混合int和str数据列的数据帧.我想先连接数据框中的列.要做到这一点,我必须将int列转换为str.我试着这样做:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])
Run Code Online (Sandbox Code Playgroud)

要么

mtrx['X.3'] = mtrx['X.3'].astype(str)
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下它都不起作用,我收到的错误是"无法连接'str'和'int'对象".连接两str列是完美的.

Jef*_*eff 111

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
Run Code Online (Sandbox Code Playgroud)

转换系列

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'
Run Code Online (Sandbox Code Playgroud)

不要忘记将结果分配回来:

df['A'] = df['A'].apply(str)
Run Code Online (Sandbox Code Playgroud)

转换整个帧

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'
Run Code Online (Sandbox Code Playgroud)

df = df.applymap(str)
Run Code Online (Sandbox Code Playgroud)

  • 我真的不明白为什么,但是mtrx ['X.3'].apply(str)对我来说也不起作用:( dtype仍显示int64.23177行和X.3列的数据帧只有数字. [21]:mtrx ['X.3'].dtype Out [21]:dtype('int64') (3认同)

小智 81

更改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倍. (6认同)
  • 这对我有用。`df['A'] = df['A'].apply(str)` 也有效。@Jeff 提供的答案对我不起作用。 (2认同)
  • 关于 @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='将 pandas 导入为 pd; c = pd.Series(范围(1000))').timeit(1000) 0.8004439630312845 (2认同)

Gov*_*nda 17

将列转换为字符串有四种方法

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)
Run Code Online (Sandbox Code Playgroud)

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

#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')
Run Code Online (Sandbox Code Playgroud)

输出

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
Run Code Online (Sandbox Code Playgroud)

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


小智 14

使用以下代码:

df.column_name = df.column_name.astype('str')
Run Code Online (Sandbox Code Playgroud)


Kei*_*ith 13

警告:给出的两个解决方案( 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()
Run Code Online (Sandbox Code Playgroud)

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

  • to_string 允许您选择 Nan 的处理,例如返回空字符串而不是“Nan” (2认同)

小智 7

我意识到这是一个老问题,但由于这是 df 字符串转换出现的第一件事,所以恕我直言,它应该是最新的。

如果您希望实际的 dtype 为字符串(而不是对象)和/或如果您需要在 df 中处理日期时间转换和/或 df 中有 NaN/None。以上都不起作用

你应该使用:

df.astype('string')
Run Code Online (Sandbox Code Playgroud)

您可以比较此 df 的结果:

import pandas as pd
import numpy as np
from datetime import datetime

# Example dataframe
min_index = datetime(2050, 5, 2, 0, 0, 0)
max_index = datetime(2050, 5, 3, 23, 59, 0)
df = pd.DataFrame(data=pd.date_range(start=min_index, end=max_index, freq = "H"), columns=["datetime"])
df["hours"] = df["datetime"].dt.hour
df["day_name"] = df["datetime"].dt.strftime("%A")
df["numeric_cat"] = [np.random.choice([0,1,2]) for a in range(df.shape[0])]

# Add missing values:
df = df.mask(np.random.random(df.shape) < 0.1)

# str 
df1 = df.astype(str) #same pb with apply(str)
df1.isnull().sum().sum() # return 0 which is wrong
df1.info() #gives you a dtype object 

# string
df2 = df.astype('string')
df2.isnull().sum().sum() # return the correct nb of missing value
df2.info() #gives you a dtype string
Run Code Online (Sandbox Code Playgroud)

  • 千真万确。如果将列转换为“str”而不是“string”,则结果将是具有可能的“nan”值的对象类型。如果您随后将数据帧保存为 Null 合理格式,例如 Parquet 文件,您将因为这个“str”而感到非常头痛。我花了几个小时才找到问题,`df['column_name'] = df['column_name'].astype("string")`解决了它 (2认同)