我有以下数据帧从一个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}

当前回答

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

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

其他回答

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

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

我通常用这个:

pd['Column'].map(str)

熊猫版本:1.3.5

更新后的答案

Df ['colname'] = Df ['colname'].astype(str) =>默认情况下这应该有效。但是如果你在使用astype(str)之前创建了str变量,比如str = "myString",这将不起作用。在本例中,您可能想使用下面的行。

[‘科尔’]

===========

(注:不正确的旧解释)

Df ['colname'] = Df ['colname'].astype('str') =>将数据帧列转换为字符串类型

等等,等等,等等

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

total_rows['ColumnID'] = total_rows['ColumnID']。Apply (lambda x: str(x))

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

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

在pandas 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')

从pandas 1.0开始,考虑使用“string”类型代替。

# pandas >= 1.0
s = pd.Series(['a', 'b', 'c'], dtype="string")
s.dtype
# StringDtype

以下是文档中引用的原因:

在对象dtype数组中,可能会意外地混合存储字符串和非字符串。最好有一个专用的dtype。 对象dtype中断特定于dtype的操作,如DataFrame.select_dtypes()。没有一个明确的方法来选择文本 排除非文本但仍然是对象类型的列。 读取代码时,对象dtype数组的内容没有'string'明确。

请参见“string”和object之间的行为差异。

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


为什么我应该停止使用它?

不小心混合了dtypes类型 第一个原因,如文档中所述,是您可能会意外地将非文本数据存储在对象列中。

# 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.
# pandas >= 1.0
pd.Series(['a', 'b', 1.23], dtype="string")

0       a
1       b
2    1.23
dtype: string

pd.Series(['a', 'b', 1.23], dtype="string").tolist()
# ['a', 'b', '1.23']   # it's a string and we just averted some potentially nasty bugs.

很难区分字符串和其他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

从pandas 1.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版本),没有性能上的好处,但是文档希望未来的增强能够显著提高性能,并减少“字符串”列的内存使用,而不是对象。话虽如此,养成好习惯越早越好!