Python 将列转换为熊猫中的字符串

Python 将列转换为熊猫中的字符串,python,pandas,string,type-conversion,Python,Pandas,String,Type Conversion,我从SQL查询中获得以下数据帧: (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 Co

我从SQL查询中获得以下数据帧:

(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}

转换为字符串的一种方法是使用:

但是,您可能正在寻找将键转换为有效json(从而将键转换为字符串)的函数:


注意:您可以传入一个缓冲区/文件以将其保存到,以及一些其他选项…

转换为字符串的一种方法是使用:

但是,您可能正在寻找将键转换为有效json(从而将键转换为字符串)的函数:


注意:您可以传入一个缓冲区/文件,将其与其他一些选项一起保存到…

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

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

下面是另一个,对于将多列转换为字符串而不仅仅是单列非常有用:

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

如果需要将所有列转换为字符串,只需使用:

df = df.astype(str)
如果您需要将除少数列之外的所有内容都转换为字符串/对象,那么这非常有用,然后返回并将其他内容转换为所需内容(在本例中为整数):


如果需要将所有列转换为字符串,只需使用:

df = df.astype(str)
如果您需要将除少数列之外的所有内容都转换为字符串/对象,那么这非常有用,然后返回并将其他内容转换为所需内容(在本例中为整数):

使用
.apply()
lambda
转换函数在这种情况下也有效:

 df[["D", "E"]] = df[["D", "E"]].astype(int) 
total_rows['ColumnID']=total_rows['ColumnID']。应用(lambda x:str(x))

对于整个数据帧,您可以使用
.applymap()
。 (但在任何情况下,
.astype()
都可能更快)

使用带有
lambda
转换函数的
.apply()
在这种情况下也有效:

 df[["D", "E"]] = df[["D", "E"]].astype(int) 
total_rows['ColumnID']=total_rows['ColumnID']。应用(lambda x:str(x))

对于整个数据帧,您可以使用
.applymap()
。 (但在任何情况下,
.astype()
都可能更快)

pandas>=1.0: 在pandas 1.0之前(实际上是0.25),这是将系列/列声明为字符串的实际方式:

# pandas <= 0.25
# Note to pedants: specifying the type is unnecessary since pandas will 
# automagically infer the type as object
s = pd.Series(['a', 'b', 'c'], dtype=str)
s.dtype
# dtype('O')
正如文件所引用的,原因如下:

  • 您可能会意外地将字符串和非字符串混合存储在对象数据类型数组中。最好有一个专用的数据类型

  • object
    dtype中断特定于数据类型的操作,如
    DataFrame。选择\u dtypes()
    。没有一种明确的方法可以只选择文本 不包括非文本但仍为对象的数据类型列

  • 读取代码时,
    对象
    数据类型数组的内容不如
    字符串
    清晰

  • 另请参见关于的一节

    (在0.24中引入并在1.0中正式化)比numpy更接近pandas,这是很好的,因为numpy类型不够强大。例如,NumPy没有任何方法来表示整数数据中缺少的数据(因为
    type(NaN)=float
    )。但是熊猫可以使用


    我为什么要停止使用它? 意外混合数据类型
    第一个原因(如文档中所述)是您可能会意外地将非文本数据存储在对象列中

    # pandas <= 0.25
    pd.Series(['a', 'b', 1.23])   # whoops, this should have been "1.23"
    
    0       a
    1       b
    2    1.23
    dtype: object
    
    pd.Series(['a', 'b', 1.23]).tolist()
    # ['a', 'b', 1.23]   # oops, pandas was storing this as float all the time.
    
    很难区分字符串和其他python对象
    另一个明显的例子是很难区分“字符串”和“对象”。对象本质上是不支持操作的任何类型的覆盖类型

    考虑一下

    # Setup
    df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [{}, [1, 2, 3], 123]})
    df
     
       A          B
    0  a         {}
    1  b  [1, 2, 3]
    2  c        123
    
    在0.25之前,几乎没有办法区分“A”和“B”没有相同类型的数据

    # pandas <= 0.25  
    df.dtypes
    
    A    object
    B    object
    dtype: object
    
    df.select_dtypes(object)
    
       A          B
    0  a         {}
    1  b  [1, 2, 3]
    2  c        123
    
    可读性
    这是不言自明的;-)


    好的,那么我现在应该停止使用它吗? ……没有。在撰写本回答(1.1版)时,没有性能优势,但文档预计未来的增强功能将显著提高性能并减少
    “string”
    列(而不是对象)的内存使用。尽管如此,养成好习惯从来都不为时尚早

    熊猫>=1.0: 在pandas 1.0之前(实际上是0.25),这是将系列/列声明为字符串的实际方式:

    # pandas <= 0.25
    # Note to pedants: specifying the type is unnecessary since pandas will 
    # automagically infer the type as object
    s = pd.Series(['a', 'b', 'c'], dtype=str)
    s.dtype
    # dtype('O')
    
    正如文件所引用的,原因如下:

  • 您可能会意外地将字符串和非字符串混合存储在对象数据类型数组中。最好有一个专用的数据类型

  • object
    dtype中断特定于数据类型的操作,如
    DataFrame。选择\u dtypes()
    。没有一种明确的方法可以只选择文本 不包括非文本但仍为对象的数据类型列

  • 读取代码时,
    对象
    数据类型数组的内容不如
    字符串
    清晰

  • 另请参见关于的一节

    (在0.24中引入并在1.0中正式化)比numpy更接近pandas,这是很好的,因为numpy类型不够强大。例如,NumPy没有任何方法来表示整数数据中缺少的数据(因为
    type(NaN)=float
    )。但是熊猫可以使用


    我为什么要停止使用它? 意外混合数据类型
    第一个原因(如文档中所述)是您可能会意外地将非文本数据存储在对象列中

    # pandas <= 0.25
    pd.Series(['a', 'b', 1.23])   # whoops, this should have been "1.23"
    
    0       a
    1       b
    2    1.23
    dtype: object
    
    pd.Series(['a', 'b', 1.23]).tolist()
    # ['a', 'b', 1.23]   # oops, pandas was storing this as float all the time.
    
    很难区分字符串和其他python对象
    另一个明显的例子是很难区分“字符串”和“对象”。对象本质上是不支持操作的任何类型的覆盖类型

    考虑一下

    # Setup
    df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [{}, [1, 2, 3], 123]})
    df
     
       A          B
    0  a         {}
    1  b  [1, 2, 3]
    2  c        123
    
    在0.25之前,几乎没有办法区分“A”和“B”没有相同类型的数据

    # pandas <= 0.25  
    df.dtypes
    
    A    object
    B    object
    dtype: object
    
    df.select_dtypes(object)
    
       A          B
    0  a         {}
    1  b  [1, 2, 3]
    2  c        123
    
    可读性
    这是自我解释