Python 如何在级数上应用函数

Python 如何在级数上应用函数,python,pandas,apply,series,Python,Pandas,Apply,Series,给定一系列s: Name 0 Tennessee Oilers 1 Tennessee Titans 2 Washington Redskins 我想应用一个函数来重命名这些值 translate = { 'Houston Oilers': 'Tennessee Titans', 'Tennessee Oilers': 'Tennessee Titans' } s = s.apply(lambda x: translate

给定一系列
s

                  Name
0     Tennessee Oilers
1     Tennessee Titans
2  Washington Redskins
我想应用一个函数来重命名这些值

translate = {
    'Houston Oilers': 'Tennessee Titans',
    'Tennessee Oilers': 'Tennessee Titans'
}

s = s.apply(lambda x: translate.get(x, x))
这引发了:

TypeError:(“'Series'对象是可变的,因此它们不能 散列“、u”出现在索引0')

如果我把这个应用到DataFrame的列上,它就会工作了

我以为我是根据“您能纠正我吗?”

用于执行查找:

In [204]:
translate = {
    'Houston Oilers': 'Tennessee Titans',
    'Tennessee Oilers': 'Tennessee Titans'
}
s.map(translate)

Out[204]:
0    Tennessee Titans
1                 NaN
2                 NaN
Name: Name, dtype: object
s=s.apply(lambda x:translate.get(x,x))
失败的原因是,此处的lambda是一个pandas
系列
,无法用作给定错误原因的键查找值,因为无法对dict键必须是哪些进行哈希运算

编辑

事实上,我无法重现你的错误:

In [210]:
s.apply(lambda x: translate.get(x, x))

Out[210]:
0       Tennessee Titans
1       Tennessee Titans
2    Washington Redskins
Name: Name, dtype: object
以上方法很好

编辑1

要保留不存在的值,可以调用和:

当您使用
read\u csv
读取csv时,即使它只有一列,也会返回df,如果您想要一个序列,则传递参数
squeak=True

In [223]:
t="""Name
Tennessee Oilers
Tennessee Titans
Washington Redskins"""
type(pd.read_csv(io.StringIO(t), squeeze=True))

Out[223]:
pandas.core.series.Series
编辑2

发生错误的原因是您对一列df调用了apply:

pd.DataFrame(s).apply(lambda x: translate.get(x, x))
所以这不同于一个系列,其中,
apply
迭代每个可以散列的值,但这里它传递的是整个不能散列的
系列
,如果您这样做,它将起作用:

In [227]:
pd.DataFrame(s).apply(lambda x: translate.get(x['Name'], x['Name']), axis=1)

Out[227]:
0       Tennessee Titans
1       Tennessee Titans
2    Washington Redskins
dtype: object

传递
axis=1
执行行值传递

Thx,但如果不在
translate
中,我宁愿保留这些值。我无法重现您的错误,唯一的失败方法是如果您执行了
pd.DataFrame(s)。apply(lambda x:translate.get(x,x))
出于某种原因,我的1列系列读取为DataFrame(使用
read_csv
)这正是我的代码中断的原因。谢谢!如果您想要一个系列,请将param
squeak=True
传递到
read_csv
In [227]:
pd.DataFrame(s).apply(lambda x: translate.get(x['Name'], x['Name']), axis=1)

Out[227]:
0       Tennessee Titans
1       Tennessee Titans
2    Washington Redskins
dtype: object