我想将表格(表示为列表列表)转换为Pandas DataFrame . 作为一个非常简单的例子:
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
将列转换为适当类型的最佳方法是什么,在这种情况下,将第2列和第3列转换为浮点数?有没有办法在转换为DataFrame时指定类型?或者,最好先创建DataFrame,然后循环遍历列以更改每列的类型?理想情况下,我想以动态方式执行此操作,因为可能有数百列,我不想确切地指定哪些列属于哪种类型 . 我可以保证的是,每列包含相同类型的值 .
6 回答
这是一个函数,它将DataFrame和列列表作为参数,并将列中的所有数据强制转换为数字 .
所以,举个例子:
您有三个主要选项来转换pandas中的类型 .
1. to_numeric()
将DataFrame的一个或多个列转换为数值的最佳方法是使用pandas.to_numeric() .
此函数将尝试根据需要将非数字对象(如字符串)更改为整数或浮点数 .
基本用法
to_numeric()
的输入是DataFrame的Series或单列 .如您所见,返回一个新系列 . 请记住将此输出分配给变量或列名称以继续使用它:
您还可以使用它通过
apply()
方法转换DataFrame的多个列:只要你的 Value 都可以转换,那可能就是你所需要的 .
错误处理
但是,如果某些值无法转换为数字类型呢?
to_numeric()
也采用errors
关键字参数,允许您强制非数字值为NaN
,或者只是忽略包含这些值的列 .这是一个使用一系列字符串
s
的示例,其中包含对象dtype:如果无法转换值,则默认行为是提升 . 在这种情况下,它无法处理字符串'pandas':
我们可能希望将'pandas'视为缺失/错误的数值,而不是失败 . 我们可以使用
errors
关键字参数将无效值强制转换为NaN
:errors
的第三个选项只是在遇到无效值时忽略该操作:当您想要转换整个DataFrame时,最后一个选项特别有用,但不知道哪些列可以可靠地转换为数字类型 . 在这种情况下,只需写:
该函数将应用于DataFrame的每一列 . 可以转换为可以转换为数字类型的列,而不能(例如,它们包含非数字字符串或日期)的列将保持不变 .
向下倾斜
默认情况下,使用
to_numeric()
进行转换将为您提供int64
或float64
dtype(或您的平台本机的任何整数宽度) .这通常是你想要的,但是如果你想节省一些内存并使用更紧凑的dtype,比如
float32
或int8
呢?to_numeric()
为您提供向下转换为'integer','signed','unsigned','float'的选项 . 这是一个简单系列s
整数类型的示例:向下转换为'整数'使用可以保存值的最小可能整数:
向下'漂浮'同样选择一个小于正常的浮动类型:
2. astype()
astype()方法使您能够明确了解您希望DataFrame或Series具有的dtype . 它非常通用,你可以尝试从一种类型转向另一种类型 .
基本用法
只需选择一种类型:您可以使用NumPy dtype(例如
np.int16
),某些Python类型(例如bool)或pandas特定类型(例如分类dtype) .在要转换的对象上调用方法,_484364将尝试为您转换它:
注意我说"try" - 如果
astype()
不知道如何转换Series或DataFrame中的值,它将引发错误 . 例如,如果您有NaN
或inf
值,则在尝试将其转换为整数时会出错 .从pandas 0.20.0开始,通过传递
errors='ignore'
可以抑制此错误 . 您的原始对象将保持原样不变 .小心点
astype()
功能强大,但有时会转换值"incorrectly" . 例如:这些是小整数,那么如何转换为无符号8位类型以节省内存?
转换有效,但-7被包围成249(即28 - 7)!
尝试使用
pd.to_numeric(s, downcast='unsigned')
进行向下转换可以帮助防止此错误 .3. infer_objects()
Pandas版本0.21.0引入了方法infer_objects(),用于将具有对象数据类型的DataFrame列转换为更具体的类型(软转换) .
例如,这是一个包含两列对象类型的DataFrame . 一个包含实际整数,另一个包含表示整数的字符串:
使用
infer_objects()
,可以将列'a'的类型更改为int64:列'b'已被单独留下,因为它的值是字符串,而不是整数 . 如果您想尝试强制将两列的转换为整数类型,则可以使用
df.astype(int)
.如何创建两个数据框,每个数据框的列都有不同的数据类型,然后将它们一起添加?
Results
创建数据框后,可以使用第1列中的浮点变量和第2列中的字符串(或所需的任何数据类型)填充它 .
当我使用've only needed to specify specific columns, and I want to be explicit, I'时(每DOCS LOCATION):
所以,使用原始问题,但为其提供列名...
这个怎么样?
下面的代码将更改列的数据类型 .
代替数据类型,你可以给你的数据类型 . 你想要什么像str,float,int等 .