python 在Pandas中将列转换为字符串

qoefvg9y  于 2022-10-30  发布在  Python
关注(0)|答案(8)|浏览(257)

我从一个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}
wribegjk

wribegjk1#

转换为字符串的一种方法是使用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"}'
  • 注意:您可以传入一个缓冲区/文件来保存此文件,沿着一些其他选项... *
qmelpv7a

qmelpv7a2#

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

df = df.astype(str)

如果除了少数几列之外,你需要将其他所有列都转换为字符串/对象,然后返回并将其他列转换为你需要的任何类型(在本例中为整数),这将非常有用:

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

wz8daaqr3#

Pandas〉= 1.0:是时候停止使用astype(str)了!

在panda 1.0之前(实际上是0.25),这是声明Series/column为字符串的实际方式:


# 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')

从panda 1.0开始,请考虑改用**"string"类型**。


# pandas >= 1.0

s = pd.Series(['a', 'b', 'c'], dtype="string")
s.dtype

# StringDtype

以下是其中的原因:
1.你可能不小心在一个对象数据类型数组中存储了字符串和非字符串的混合体。最好有一个专用的数据类型。

  1. object dtype会中断特定于dtype的操作(如DataFrame.select_dtypes())。没有明确的方法来仅选择文本,同时排除非文本但仍为对象dtype的列。
    1.阅读代码时,object dtype数组的内容不如'string'清楚。
    另请参阅"string"object之间的行为差异一节。
    Extension types(在Python 0.24中引入,在Python 1.0中形式化)比numpy更接近panda,这很好,因为numpy类型的功能不够强大。例如,NumPy没有任何方法来表示整数数据中的缺失数据(从type(NaN) == float开始)。但panda可以使用Nullable Integer columns

为什么要停用?

意外地混合了数据类型

第一个原因,正如文档中所概述的,是您可能会意外地将非文本数据存储在对象列中。
第一个

难以区分字符串和其他python对象

另一个明显的例子是,很难区分“字符串”和“对象”。对象本质上是不支持vectorizable操作的任何类型的总括类型。
请考虑:


# 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

直到Pandas0.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

从Pandas1.0开始,这变得简单多了:


# pandas >= 1.0

# Convenience function I call to help illustrate my point.

df = df.convert_dtypes()
df.dtypes

A    string
B    object
dtype: object

df.select_dtypes("string")

   A
0  a
1  b
2  c

可读性

这是不言自明的;- )

好的,那么我现在应该停止使用它吗?

...否。在编写此答案(版本1.1)时,没有性能优势,但文档预计未来的增强功能将显著提高性能,并减少"string"列相对于对象的内存使用。尽管如此,养成良好习惯永远都不为早!

s4chpxco

s4chpxco4#

下面是另一个例子,特别适用于****将多个列转换为字符串,而不仅仅是单列:

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
qlckcl4x

qlckcl4x5#

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

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)与其余两种技术相比花费更少时间

kgsdhlau

kgsdhlau6#

我通常使用这一个:

pd['Column'].map(str)
n6lpvg4x

n6lpvg4x7#

在这种情况下,使用.apply()lambda转换函数也有效:
total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
对于整个 Dataframe ,您可以使用.applymap()。(但在任何情况下,.astype()都可能更快)

iszxjhcz

iszxjhcz8#

更新时间:2022年,Pandas版:1.3.5

df['colname'] = df['colname'].astype('str') =〉将 Dataframe 列转换为字符串类型
df['colname'] = df['colname'].astype(str) =〉给出错误

相关问题