python - 在一个系列中,如何应用函数

给定一系列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' objects are mutable, thus they cannot be hashed", 
u'occurred at index 0')

时间:

使用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,这不能作为键去查找值,因为它不能被散列。

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


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

工作正常

若要保留不存在的值,可以调用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时,即使只有一列,如果你想要传递参数squeeze=True,它将返回一个df :


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

由于你调用了single df上的应用,出现了错误:


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

...