我是python和pandas的新手,我有一个小问题。我试图在论坛和Google上找到一种解决方案,但找不到。所以我们开始:
我有一个包含唯一名称的系列:
in [8]: Name_Series.head()
Out[8]:
0 US2005642
1 US2007961
2 US13721
3 US2013770
4 US14822
dtype: object
在我的数据框中,有一列,每行包含一个名称。
In [5]: df.Name.head()
Out[5]:
0 JP2015121
1 US14822
2 US14358
3 JP2015539
4 JP2015156
Name: AppNo, dtype: object
我需要的是新列'Label',如果Name_Series中包含Name,则包含1;如果不包含Name,则包含0。
我的想法是编写一个返回1或0的函数并将其应用于数据框:
def Label(Name_Series, Name):
if Name_Series.str.contains(Name).sum()>0:
return 1
else:
return 0
df['Prio'] = list(map(Label_Prio, PrioList, df.AppNo))
不幸的是,这导致以下错误:
IN [9]: df['Label'] = list(map(Label, Name_Series, df.Name))
Traceback (most recent call last):
File "<ipython-input-9-713d2d55d303>", line 1, in <module>
df['Label'] = list(map(Label, Name_Series, df.Name))
File "Test.py", line 60, in Label
if Name_Series.str.contains(Name).sum()>0:
AttributeError: 'unicode' object has no attribute 'str'
因此,当我使用地图功能时,它仅从系列中获取一个值,而不是整个系列。我能以某种方式告诉map函数将整个系列作为参数,而不是系列中的一个值吗?
如果有人想出另一种解决方案可以达到相同的结果,我将不胜感激。我的第一个尝试是编写一个循环遍历每行并返回1或0的循环,但这非常慢。数据框将在其中应用200k +行,要搜索的系列将包含约20k个名称。
您可以简单地使用isin
。将布尔结果乘以1会将其转换为零和一:您也可以使用.astype(int)
df['Label'] = df.Name.isin(Name_Series) * 1
>>> df
Name Label
0 JP2015121 0
1 US14822 1
2 US14358 0
3 JP2015539 0
4 JP2015156 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句