我从一个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}
8条答案
按热度按时间wribegjk1#
转换为字符串的一种方法是使用astype:
然而,也许您正在寻找
to_json
函数,该函数将把键转换为有效的json(从而将您的键转换为字符串):qmelpv7a2#
如果需要将所有列转换为字符串,只需使用:
如果除了少数几列之外,你需要将其他所有列都转换为字符串/对象,然后返回并将其他列转换为你需要的任何类型(在本例中为整数),这将非常有用:
wz8daaqr3#
Pandas〉= 1.0:是时候停止使用
astype(str)
了!在panda 1.0之前(实际上是0.25),这是声明Series/column为字符串的实际方式:
从panda 1.0开始,请考虑改用**
"string"
类型**。以下是其中的原因:
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操作的任何类型的总括类型。
请考虑:
直到Pandas0.25,实际上没有办法区分“A”和“B”是否有相同类型的数据。
从Pandas1.0开始,这变得简单多了:
可读性
这是不言自明的;- )
好的,那么我现在应该停止使用它吗?
...否。在编写此答案(版本1.1)时,没有性能优势,但文档预计未来的增强功能将显著提高性能,并减少
"string"
列相对于对象的内存使用。尽管如此,养成良好习惯永远都不为早!s4chpxco4#
下面是另一个例子,特别适用于****将多个列转换为字符串,而不仅仅是单列:
qlckcl4x5#
有四种方法可将列转换为字符串
让我们看看每种类型的性能
输出量
map(str)
和apply(str)
与其余两种技术相比花费更少时间kgsdhlau6#
我通常使用这一个:
n6lpvg4x7#
在这种情况下,使用
.apply()
和lambda
转换函数也有效:total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
对于整个 Dataframe ,您可以使用
.applymap()
。(但在任何情况下,.astype()
都可能更快)iszxjhcz8#
更新时间:2022年,Pandas版:1.3.5
df['colname'] = df['colname'].astype('str')
=〉将 Dataframe 列转换为字符串类型df['colname'] = df['colname'].astype(str)
=〉给出错误