熊猫中的 series.tolist() 和 list 之间有区别吗
Posted
技术标签:
【中文标题】熊猫中的 series.tolist() 和 list 之间有区别吗【英文标题】:Is there a difference between series.tolist() and list in pandas 【发布时间】:2019-12-10 12:59:00 【问题描述】:我定义了一个函数 z。当我传递一个列表时它可以工作,但是当我传递一个系列时(即使在转换为列表之后)它会返回错误的答案。我对函数 z 的输入参数必须是一个系列。如何解决?
list1 = [np.nan, 14975, 98121]
series1 = pd.Series([np.nan,14975,98121])
z(series1.tolist())
['0', '0', '0']
z(list1)
['0', '1', '98121']
我的 z 函数是,
def z(each):
zipcode_list = []
for i in each:
try:
if zipcodes.is_real(str(i)):
zip_code = str(i)
else:
zip_code = str(1)
except:
zip_code = str(0)
zipcode_list.append(zip_code)
return zipcodes
【问题讨论】:
它们都返回零给我,列表没有函数is_real
,所以它们都应该评估为zip_code = str(0)
您是否尝试过导入 'zipcodes' 模块,否则它将始终打印异常。
anaconda 基础环境中没有 zipcodes 模块,如果您的代码中有一个名为 zipcodes 的导入,则在您的 z 函数中重命名变量 zipcodes
谢谢,已更改
【参考方案1】:
虽然 pandas 确实正确地返回了一个列表(请参阅 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.tolist.html),但它们采取了安全路线并将系列中的值转换为浮点数而不是整数。因此,当您尝试获取浮点数的邮政编码时,它会出错。
您可以通过运行以下命令来查看:
import pandas as pd
import numpy as np
import zipcodes
list1 = [np.nan, 14975, 98121]
series1 = pd.Series([np.nan,14975,98121])
def z(each):
zipcode_list = []
for i in each:
print(i, type(i))
try:
if zipcodes.is_real(str(i)):
zip_code = str(i)
else:
zip_code = str(1)
except Exception:
zip_code = str(0)
zipcode_list.append(zip_code)
return zipcode_list
print(z(series1.tolist()))
print(z(list1))
输出:
nan <class 'float'>
14975.0 <class 'float'>
import pandas as pd
98121.0 <class 'float'>
['0', '0', '0']
nan <class 'float'>
14975 <class 'int'>
98121 <class 'int'>
['0', '1', '98121']
在将列表传递给z
之前更改代码以将列表转换为整数将解决您的问题。见:
import pandas as pd
import numpy as np
import zipcodes
list1 = [np.nan, 14975, 98121]
series1 = pd.Series([np.nan,14975,98121])
def z(each):
zipcode_list = []
for i in each:
try:
if zipcodes.is_real(str(int(i))):
zip_code = str(int(i))
else:
zip_code = str(1)
except Exception:
zip_code = str(0)
zipcode_list.append(zip_code)
return zipcode_list
print(z(series1.tolist()))
# ['0', '1', '98121']
print(z(list1))
# ['0', '1', '98121']
【讨论】:
谢谢,但“邮政编码”是一个具有 is_real() 的模块,它返回真或假。如果没有该模块,它将始终打印异常。以上是关于熊猫中的 series.tolist() 和 list 之间有区别吗的主要内容,如果未能解决你的问题,请参考以下文章