将熊猫数据框中的列从 int 转换为 string

我在熊猫中有一个数据框,它混合了 int 和 str 数据列。我想首先连接数据框架中的列。为此,我必须将 int列转换为 str列。 我试着这样做:

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

或者

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

但是在这两种情况下它都不能工作,我得到一个错误说“不能连接‘ str’和‘ int’对象”。连接两个 str列工作得非常好。

450941 次浏览
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)

更改 DataFrame 列的数据类型:

转换为:

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

致斯特拉:

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

警告 : 给定 ( astype ()和 application () )的两个解决方案都不会在 nan 或 Nothing 表单中保留 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 ()的实现所固定的

使用以下代码:

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

只是为了提供额外的参考。

以上所有的答案都将在数据帧的情况下起作用。但是如果您在创建/修改列时使用 lambda,那么上述其他人的回答将不起作用,因为在那里它被认为是一个 int 属性,而不是 Pandas 系列。必须使用 str (target _ tribute)将其作为字符串。请参考下面的例子。

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)

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

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)花费的时间更少

我知道这是一个老问题,但是因为这是 df 字符串转换的首要问题,所以恕我直言,它应该是最新的。

如果希望实际的 dtype 是字符串(而不是对象)和/或者需要在 df 中处理日期时间转换和/或者在 df 中有 NaN/Nothing。以上这些都不管用.

你应使用:

df.astype('string')

您可以在这个 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