熊猫中的 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 之间有区别吗的主要内容,如果未能解决你的问题,请参考以下文章

熊猫直播Rancho发布系统构建之路

不能连接相同长度的熊猫数据帧?

熊猫中的 Xlsxwriter 和熊猫锁定之外

当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作

大熊猫中的切片和副本有啥区别? [复制]

大熊猫中的“iloc”和“loc”是啥?