如何在Series上应用函数

时间:2015-07-09 10:56:02

标签: 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.get(x, x))

这引起了:

  

TypeError :(“'系列'对象是可变的,因此它们不可能   哈希“,你在指数0'发生了''

如果我在DataFrame的列上应用了这个,那就可以了。

我认为我按照docs这样做了。你能纠正我吗?

1 个答案:

答案 0 :(得分:3)

使用map执行查找:

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 Series,并且这不能用作错误原因的键查找值,因为它不能被散列为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

要保留不存在的值,您可以拨打dropnaupdate

In [219]:
s.update(s.map(translate).dropna())
s

Out[219]:
0       Tennessee Titans
1       Tennessee Titans
2    Washington Redskins
Name: Name, dtype: object

当您使用read_csv阅读csv时,即使它只有一列,也会返回一个df,如果您想要一个系列然后传递参数squeeze=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遍历每个可以被散列的值,但是在这里它传递了整个Series,它不能被散列,如果你这样做它会起作用:

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执行行方式值传递