Pandasデータフレーム内の列を整数から文字列に変換する


105

intとstrデータ列が混在するパンダのデータフレームがあります。最初にデータフレーム内の列を連結したいと思います。そのためには、int列をに変換する必要がありますstr。私は次のようにしようとしました:

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

または

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

しかし、どちらの場合も機能せず、「「str」オブジェクトと「int」オブジェクトを連結できない」というエラーが表示されます。2つのstr列を連結しても問題なく機能します。


回答:


136
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)

3
理由は本当にわかりませんが、mtrx ['X.3']。apply(str)も機能しません。 [21]:mtrx ['X.3']。dtype Out [21]:dtype( 'int64')
Malfet

0.7.0、UbuntuシステムにPython 2.7が付属
Malfet 2013

現在のバージョンは0.12です。アップグレードする必要があります。
ジェフ

df ['A']。apply(str)が機能していません。しかし、df.column_name = df.column_name.astype(str)は機能します。なぜだかわかりません。
Dmitry Konovalov 2018年

1
Python文字列の@DmitryKonovalovは不変なので、データを操作するときはいつでも、結果を変数に戻す必要があります。
Sriram Arvind Lakshmanakumar

91

DataFrame列のデータ型を変更します。

intへ:

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

strへ:

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


7
これは魅力的ですがapply(str)、私のテストでは@Jeff よりも約4倍遅くなっていpd.Series(np.arange(1000000))ます。
John Zwinck 2016

2
これでうまくいきます。df['A'] = df['A'].apply(str)も動作します。@Jeffが提供する答えは私には役に立ちません。
tommy.carstensen

1
@JohnZwinckのコメントについては、Python3を使用すると、apply()代わりに2倍の速度で使用する方が速いようastype()です。 1000)) ')。timeit(1000)>>> 0.41499893204309046 >>> timeit.Timer(' c.astype(str) '、setup =' import pandas as pd; c = pd.Series(range(1000)) ' ).timeit(1000)0.8004439630312845
hamx0r

15

警告:指定された両方のソリューション 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()の実装によって修正されると思います


1
to_stringを使用すると、「Nan」ではなく空の文字列を返すなど、Nanの処理を選択できます
seanv507

1
(私はあなたが言ったことを拡大するだけで、私は反対していませんでした)-+1を言いたかったです
seanv507


0

参考までに。

上記の回答はすべて、データフレームの場合に機能します。しかし、列の作成/変更中にラムダを使用している場合、これは機能しません。パンダシリーズではなくint属性と見なされるためです。文字列として作成するには、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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.