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
)这正是我的代码中断的原因。谢谢!如果您想要一个系列,请将paramsqueak=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