이 글은 주로 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, 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의 해당 항목을 추가하는 등 데이터에 대한 일부 작업을 수행하려는 경우입니다.
결과에서 값이 예상대로 추가되지 않았기 때문입니다. Pandas 유형 추가는 Python의 문자열 추가와 동일합니다.
로드된 데이터의 관련 정보를 확인한 후 다음과 같은 문제를 발견할 수 있습니다.
고객 번호의 데이터 유형은 객체 유형이 아닌 int64입니다
2016 및 2017 열의 데이터 유형은 숫자 유형(int64, float64)이 아닌 객체입니다.
성장률 및 2016년 열의 데이터 유형은 그룹은 객체 유형 대신 숫자 유형이어야 합니다
년, 월, 일 데이터 유형은 객체 유형 대신 datetime64 유형이어야 합니다
Pandas에는 데이터 유형 변환을 위한 세 가지 기본 방법이 있습니다.
유형 변환을 강제하는 astype() 함수
데이터 유형 변환을 위한 사용자 정의 함수
to_numeric(), to_datetime() 등 Pandas에서 제공하는 함수 사용
데이터 열로 데이터 유형 변환을 수행하는 가장 쉬운 방법은 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에서 데이터 유형 변환을 구현하기 위한 몇 가지 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!