如何在系列上应用功能
How to apply a function on a 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: ("'Series' objects are mutable, thus they cannot be
hashed", u'occurred at index 0')
如果我将它应用到 DataFrame 的列上,这会奏效。
我以为我是根据 docs 做的,请指正一下好吗?
使用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
以上工作正常
编辑 1
要保留不存在的值,您可以调用 dropna
and update
:
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 时,它 returns 一个 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
您的错误发生是因为您在单个列上调用了 apply df:
pd.DataFrame(s).apply(lambda x: translate.get(x, x))
所以这不同于 Series,其中 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
执行逐行值传递
给定一个系列 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')
如果我将它应用到 DataFrame 的列上,这会奏效。
我以为我是根据 docs 做的,请指正一下好吗?
使用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
以上工作正常
编辑 1
要保留不存在的值,您可以调用 dropna
and update
:
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 时,它 returns 一个 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
您的错误发生是因为您在单个列上调用了 apply df:
pd.DataFrame(s).apply(lambda x: translate.get(x, x))
所以这不同于 Series,其中 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
执行逐行值传递