python pandas数据框如果行值是串行的,则使用label(0或1)创建新列

时间:2016-03-06 18:54:20

标签: python pandas

我对python和pandas很新,我遇到了一个小问题。我试图在论坛和谷歌上找到解决方案,但无法找到解决方案。所以我们走了:

我有一个包含唯一名称的系列:

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包含在Name_Series中,则包含1;如果不包含,则包含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'

因此,当我使用地图funktion时,它只从系列中取出一个值而不是整个系列。我可以以某种方式告诉map函数将整个系列作为参数而不是系列中的一个值吗?

如果有人想出另一种导致相同结果的解决方案,我会很感激。我的第一次尝试是编写一个循环,每行返回throgh并返回1或0,但这非常慢。将应用的数据帧有200k +行,搜索系列将包含大约20k名称。

2 个答案:

答案 0 :(得分:2)

您只需使用isin即可。将布尔结果乘以1将其转换为零和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

答案 1 :(得分:0)

试试这个:

df['Prio'] = 0
df['Prio'] = df[df['Name'].isin(Name_Series)] = 1