在熊猫中将列转换为字符串


179

我从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}

Answers:


332

转换为字符串的一种方法是使用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
Keith

1
@Keith空保留很有吸引力。但该文件表示,其目的是“将DataFrame呈现给控制台友好的表格输出”。我想要一个权威的
人称一下

to_json()可能不会调用,astype(str)因为它离开datetime64及其子类的时间为自纪元以来的毫秒数。
Sussch '19

1
@Sussch我怀疑这是因为json没有明确的日期时间格式,因此您被迫使用纪元。也就是说,我认为这是标准。
安迪·海登

49

如果您需要将ALL列转换为字符串,则可以简单地使用:

df = df.astype(str)

如果您需要除几列以外的所有内容作为字符串/对象,然后返回并将其他列转换为所需的内容(在这种情况下为整数),则这很有用:

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

28

这是另一个,对于 将多列转换为字符串而不是单列特别有用

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()更快)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.