Python 将列转换为熊猫中的字符串
我从SQL查询中获得以下数据帧: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
(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()
。没有一种明确的方法可以只选择文本
不包括非文本但仍为对象的数据类型列
对象
数据类型数组的内容不如字符串
清晰
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()
。没有一种明确的方法可以只选择文本
不包括非文本但仍为对象的数据类型列
对象
数据类型数组的内容不如字符串
清晰
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
可读性这是自我解释