更改Pandas中列的数据类型
我想将一个表格(表示为列表清单)转换为Pandas DataFrame。 作为一个非常简单的例子:
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
将列转换为适当类型的最佳方式是什么?在这种情况下,第2列和第3列转换为浮点型? 有没有办法在转换为DataFrame时指定类型? 或者先创建DataFrame然后循环遍历列来更改每列的类型会更好吗? 理想情况下,我希望以动态的方式进行此操作,因为可能有数百个列,而且我不想明确指定哪些列是哪种类型。 我只能保证每列都包含相同类型的值。
您可以使用pd.to_numeric
(在版本0.17中引入)将列或系列转换为数字类型。 该功能还可以应用在使用数据帧的多个列apply
。
重要的是,该函数还会带有一个errors
关键字参数,它允许您强制非数值为NaN
,或者简单地忽略包含这些值的列。
示例使用如下所示。
个别专栏/系列
以下是使用具有对象dtype的一系列字符串s
的示例:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
该函数的默认行为是在不能转换值时引发。 在这种情况下,它不能应付字符串'熊猫':
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
我们可能不希望'熊猫'被认为是缺失/不良的价值,而不是失败。 我们可以将无效值强制转换为NaN
,如下所示:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
第三个选项只是在遇到无效值时忽略该操作:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
多列/整个数据帧
我们可能希望将此操作应用于多个列。 依次处理每一列是很枯燥的,所以我们可以使用DataFrame.apply
来让这个函数对每一列起作用。
从问题中借用DataFrame:
>>> a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
>>> df = pd.DataFrame(a, columns=['col1','col2','col3'])
>>> df
col1 col2 col3
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
然后我们可以写:
df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)
现在'col2'和'col3'根据需要具有dtype float64
。
但是,我们可能不知道我们的哪些列可以可靠地转换为数字类型。 在这种情况下,我们可以写出:
df.apply(pd.to_numeric, errors='ignore')
然后该函数将应用于整个DataFrame。 可以转换为数字类型的列将被转换,而不能(例如,它们包含非数字字符串或日期)的列将被单独保留。
还有pd.to_datetime
和pd.to_timedelta
用于转换为日期和时间戳。
软转换
版本0.21.0引入了用于将具有对象数据类型的DataFrame的列转换为更具体类型的方法infer_objects()
。
例如,我们创建一个DataFrame,其中包含两列对象类型,一列保存整数,另一列保存整数字符串:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
然后使用infer_objects()
,我们可以将列'a'的类型更改为int64:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
因为它的值是字符串,而不是整数,所以列'b'一直保留。 如果我们试图强制将两列转换为整数类型,我们可以使用df.astype(int)
来代替。
这个怎么样?
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]:
one two three
0 a 1.2 4.2
1 b 70 0.03
2 x 5 0
df.dtypes
Out[17]:
one object
two object
three object
df[['two', 'three']] = df[['two', 'three']].astype(float)
df.dtypes
Out[19]:
one object
two float64
three float64
这下面的代码将改变列的数据类型。
df[['col.name1', 'col.name2'...]] = df[['col.name1', 'col.name2'..]].astype('data_type')
代替数据类型,你可以给你的数据类型。你想要什么样的str,float,int等
链接地址: http://www.djcxy.com/p/70925.html上一篇: Change data type of columns in Pandas
下一篇: Set value for particular cell in pandas DataFrame using index