【问题标题】:Is there a difference between series.tolist() and list in pandas熊猫中的 series.tolist() 和 list 之间有区别吗
【发布时间】: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
  • 谢谢,已更改

标签: python pandas list series


【解决方案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() 的模块,它返回真或假。如果没有该模块,它将始终打印异常。
猜你喜欢
  • 2013-02-21
  • 2017-12-23
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多