パンダで列を文字列に変換する


178

SQLクエリからの次のDataFrameがあります。

(Pdb) pp total_rows
     ColumnID  RespondentCount
0          -1                2
1  3030096843                1
2  3030096845                1

そして、私はそれをこのようにピボットしたいです:

total_data = total_rows.pivot_table(cols=['ColumnID'])

(Pdb) pp total_data
ColumnID         -1            3030096843   3030096845
RespondentCount            2            1            1

[1 rows x 3 columns]


total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]

{3030096843: 1, 3030096845: 1, -1: 2}

しかし、303列が整数ではなく文字列としてキャストされるようにして、次のようにします。

{'3030096843': 1, '3030096845': 1, -1: 2}

回答:


331

文字列に変換する1つの方法は、astypeを使用することです

total_rows['ColumnID'] = total_rows['ColumnID'].astype(str)

ただし、おそらくto_json、キーを有効なjsonに変換する(したがって、キーを文字列に変換する)関数を探しています。

In [11]: df = pd.DataFrame([['A', 2], ['A', 4], ['B', 6]])

In [12]: df.to_json()
Out[12]: '{"0":{"0":"A","1":"A","2":"B"},"1":{"0":2,"1":4,"2":6}}'

In [13]: df[0].to_json()
Out[13]: '{"0":"A","1":"A","2":"B"}'

注:これを保存するバッファー/ファイルを他のオプションと一緒に渡すことができます...


3
私は()をTO_STRINGするのNULLの保全のために望ましいと考えstackoverflow.com/a/44008334/3647167
キース・

1
@Keith null保持は魅力的です。しかし、ドキュメントは、その目的は「DataFrameをコンソール向けの表形式の出力にレンダリングすること」であると述べています。権威のある人物の体重測定を
お願い

to_json()astype(str)エポック以降、datetime64とそのサブクラスをミリ秒として残すため、おそらく呼び出されません。
Sussch

1
@Susschおそらく、jsonには明示的な日時形式がないため、エポックの使用を余儀なくされます。つまり、それが標準だと思います。
アンディヘイデン

48

すべての列を文字列に変換する必要がある場合は、次のように使用できます。

df = df.astype(str)

これは、いくつかの列を除くすべてを文字列/オブジェクトにする必要がある場合に役立ちます。次に戻って、他の列を必要なもの(この場合は整数)に変換します。

 df[["D", "E"]] = df[["D", "E"]].astype(int) 

28

もう1つは、1つのだけでなく複数の列を文字列に変換する場合に特に便利です

In [76]: import numpy as np
In [77]: import pandas as pd
In [78]: df = pd.DataFrame({
    ...:     'A': [20, 30.0, np.nan],
    ...:     'B': ["a45a", "a3", "b1"],
    ...:     'C': [10, 5, np.nan]})
    ...: 

In [79]: df.dtypes ## Current datatype
Out[79]: 
A    float64
B     object
C    float64
dtype: object

## Multiple columns string conversion
In [80]: df[["A", "C"]] = df[["A", "C"]].astype(str) 

In [81]: df.dtypes ## Updated datatype after string conversion
Out[81]: 
A    object
B    object
C    object
dtype: object


0

この場合.apply()lambda変換関数での使用も機能します。

total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))

データフレーム全体については、を使用できます.applymap()。(ただし、いずれの場合もおそらく.astype()高速です)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.