>  기사  >  백엔드 개발  >  Pandas에서 데이터 유형 변환을 구현하기 위한 몇 가지 팁

Pandas에서 데이터 유형 변환을 구현하기 위한 몇 가지 팁

不言
不言원래의
2018-05-07 11:44:007517검색

이 글은 주로 Pandas에서 데이터 유형 변환을 구현하는 몇 가지 기술을 소개합니다. 이제 이를 여러분과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다

Pandas는 Python Data에서 중요합니다. 분석 도구에서 데이터 분석을 위해 Pandas를 사용할 때 올바른 데이터 유형이 사용되는지 확인하는 것이 매우 중요합니다. 그렇지 않으면 예측할 수 없는 오류가 발생할 수 있습니다. Pandas의 데이터 유형: 데이터 유형은 본질적으로 프로그래밍 언어가 데이터를 저장하고 조작하는 방법을 이해하는 데 사용하는 내부 구조입니다. 예를 들어, 프로그램은 5 + 10과 같이 두 개의 숫자를 더해 15를 얻을 수 있다는 것을 이해해야 합니다. 또는 "cat" 및 "hat"과 같은 두 개의 문자열인 경우 이를 연결(추가)하여 "cathat"을 얻을 수 있습니다. Shangxuetang·Baizhan의 프로그래머인 Chen 선생님은 Pandas 데이터 유형에 대해 잠재적으로 혼란스러운 점 중 하나는 Pandas, Python 및 numpy의 데이터 유형 간에 일부 중복이 있다는 점을 지적했습니다.

대부분의 경우 Pandas 유형을 해당 NumPy 유형에 명시적으로 캐스팅해야 하는지 여부에 대해 걱정할 필요가 없습니다. 일반적으로 Pandas의 기본 int64 및 float64를 사용할 수 있습니다. 이 표를 포함시킨 유일한 이유는 때때로 코드 줄 사이에서 또는 자체 분석 중에 Numpy 유형을 볼 수 있기 때문입니다.

데이터 유형은 오류나 예상치 못한 결과가 발생할 때까지 신경 쓰지 않는 것 중 하나입니다. 하지만 추가 분석을 위해 Pandas에 새 데이터를 로드할 때 가장 먼저 확인해야 할 사항이기도 합니다.

저자는 한동안 Pandas를 사용해왔지만 여전히 몇 가지 사소한 문제에서 실수를 저지르고 있습니다. 소스를 다시 추적해 보니 일부 기능 열이 데이터 작업 시 Pandas에서 처리할 수 있는 유형이 아닌 것을 발견했습니다. 따라서 이 기사에서는 Python의 기본 데이터 유형을 Pandas가 처리할 수 있는 데이터 유형으로 변환하는 방법에 대한 몇 가지 팁에 대해 설명합니다.


Pandas, Numpy 및 Python에서 각각 지원하는 데이터 유형

위 표에서 Pandas가 가장 풍부한 데이터 유형을 지원하는 경우에 따라 Numpy의 데이터 유형이 될 수 있음을 알 수 있습니다. Pandas와 마찬가지로 데이터 유형을 서로 변환할 수 있습니다. 결국 Pandas 라이브러리는 Numpy를 기반으로 개발되었습니다.

분석을 위한 실제 데이터 소개

데이터 유형은 잘못된 결과가 나올 때까지 크게 신경쓰지 않을 수 있는 사항이므로 이해를 돕기 위해 실제 데이터 분석 사례를 소개합니다.

import numpy as np
import pandas as pd

data = pd.read_csv('data.csv', encoding='gbk') #因为数据中含有中文数据
data

이제 데이터 열 2016 및 2017의 해당 항목을 추가하는 등 데이터에 대한 일부 작업을 수행하려는 경우입니다.

data['2016'] + data['2017'] #우리가 당연하게 여기는 것


결과에서 값이 예상대로 추가되지 않았기 때문입니다. Pandas 유형 추가는 Python의 문자열 추가와 동일합니다.

data.info() #데이터를 처리하기 전, 로드된 데이터의 관련 정보를 먼저 확인해야 합니다


로드된 데이터의 관련 정보를 확인한 후 다음과 같은 문제를 발견할 수 있습니다.

고객 번호의 데이터 유형은 객체 유형이 아닌 int64입니다

  • 2016 및 2017 열의 데이터 유형은 숫자 유형(int64, float64)이 아닌 객체입니다.

  • 성장률 및 2016년 열의 데이터 유형은 그룹은 객체 유형 대신 숫자 유형이어야 합니다

  • 년, 월, 일 데이터 유형은 객체 유형 대신 datetime64 유형이어야 합니다

  • Pandas에는 데이터 유형 변환을 위한 세 가지 기본 방법이 있습니다.

유형 변환을 강제하는 astype() 함수

  • 데이터 유형 변환을 위한 사용자 정의 함수

  • to_numeric(), to_datetime() 등 Pandas에서 제공하는 함수 사용

  • 유형 변환에는 astype() 함수 사용

데이터 열로 데이터 유형 변환을 수행하는 가장 쉬운 방법은 astype() 함수를 사용하는 것입니다

data['客户编号'].astype('object')

data['客户编号'] = data['客户编号'].astype('object') #对原始数据进行转换并覆盖原始数据列

다음은 astype() 함수가 매우 좋아 보이는 몇 가지 예입니다. 열 데이터에서 작동하지만 실패합니다.

data['2017'].astype('float')

data['所属组'].astype('int')


从上面两个例子可以看出,当待转换列中含有不能转换的特殊值时(例子中¥,ErrorValue等)astype()函数将失效。有些时候astype()函数执行成功了也并不一定代表着执行结果符合预期(神坑!)

data['状态'].astype('bool')


乍一看,结果看起来不错,但仔细观察后,会发现一个大问题。那就是所有的值都被替换为True了,但是该列中包含好几个N标志,所以astype()函数在该列也是失效的。

总结一下astype()函数有效的情形:

  • 数据列中的每一个单位都能简单的解释为数字(2, 2.12等)

  • 数据列中的每一个单位都是数值类型且向字符串object类型转换

如果数据中含有缺失值、特殊字符astype()函数可能失效。

使用自定义函数进行数据类型转换

该方法特别适用于待转换数据列的数据较为复杂的情形,可以通过构建一个函数应用于数据列的每一个数据,并将其转换为适合的数据类型。

对于上述数据中的货币,需要将它转换为float类型,因此可以写一个转换函数:

def convert_currency(value):
 """
 转换字符串数字为float类型
 - 移除 ¥ ,
 - 转化为float类型
 """
 new_value = value.replace(',', '').replace('¥', '')
 return np.float(new_value)

现在可以使用Pandas的apply函数通过covert_currency函数应用于2016列中的所有数据中。

data['2016'].apply(convert_currency)


该列所有的数据都转换成对应的数值类型了,因此可以对该列数据进行常见的数学操作了。如果利用lambda表达式改写一下代码,可能会比较简洁但是对新手不太友好。

data['2016'].apply(lambda x: x.replace('¥', '').replace(',', '')).astype('float')

当函数需要重复应用于多个列时,个人推荐使用第一种方法,先定义函数还有一个好处就是可以搭配read_csv()函数使用(后面介绍)。

#2016、2017列完整的转换代码
data['2016'] = data['2016'].apply(convert_currency)
data['2017'] = data['2017'].apply(convert_currency)

同样的方法运用于增长率,首先构建自定义函数

def convert_percent(value):
 """
 转换字符串百分数为float类型小数
 - 移除 %
 - 除以100转换为小数
 """
 new_value = value.replace('%', '')
 return float(new_value) / 100

使用Pandas的apply函数通过covert_percent函数应用于增长率列中的所有数据中。

data['增长率'].apply(convert_percent)

使用lambda表达式:

data['增长率'].apply(lambda x: x.replace('%', '')).astype('float') / 100

结果都相同:


为了转换状态列,可以使用Numpy中的where函数,把值为Y的映射成True,其他值全部映射成False。

data['状态'] = np.where(data['状态'] == 'Y', True, False)

同样的你也可以使用自定义函数或者使用lambda表达式,这些方法都可以完美的解决这个问题,这里只是多提供一种思路。

利用Pandas的一些辅助函数进行类型转换

Pandas的astype()函数和复杂的自定函数之间有一个中间段,那就是Pandas的一些辅助函数。这些辅助函数对于某些特定数据类型的转换非常有用(如to_numeric()、to_datetime())。所属组数据列中包含一个非数值,用astype()转换出现了错误,然而用to_numeric()函数处理就优雅很多。

pd.to_numeric(data['所属组'], errors='coerce').fillna(0)


可以看到,非数值被替换成0.0了,当然这个填充值是可以选择的,具体文档见
pandas.to_numeric - pandas 0.22.0 documentation

Pandas中的to_datetime()函数可以把单独的year、month、day三列合并成一个单独的时间戳。

pd.to_datetime(data[['day', 'month', 'year']])

完成数据列的替换

data['new_date'] = pd.to_datetime(data[['day', 'month', 'year']]) #新产生的一列数据
data['所属组'] = pd.to_numeric(data['所属组'], errors='coerce').fillna(0)

到这里所有的数据列都转换完毕,最终的数据显示:


在读取数据时就对数据类型进行转换,一步到位

data2 = pd.read_csv("data.csv",
   converters={
    '客户编号': str,
    '2016': convert_currency,
    '2017': convert_currency,
    '增长率': convert_percent,
    '所属组': lambda x: pd.to_numeric(x, errors='coerce'),
    '状态': lambda x: np.where(x == "Y", True, False)
    },
   encoding='gbk')

在这里也体现了使用自定义函数比lambda表达式要方便很多。(大部分情况下lambda还是很简洁的,笔者自己也很喜欢使用)

요약

데이터 세트를 작동하는 첫 번째 단계는 올바른 데이터 유형이 설정되었는지 확인하는 것입니다. 그런 다음 Pandas는 이러한 기능을 통해 데이터 분석, 시각화 및 기타 작업을 수행할 수 있습니다. 기능 그러면 데이터를 분석하는 것이 매우 편리할 것입니다.

관련 권장 사항:

pandas는 특정 인덱스에서 행 선택을 구현합니다

위 내용은 Pandas에서 데이터 유형 변환을 구현하기 위한 몇 가지 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.