测试Pandas系列中的值是否在数组中

时间:2014-11-09 19:15:16

标签: python pandas

这似乎是明显的答案,但......

我有一个这样的系列:

Dataset['Variable'] = ['a','b','b','a','e','c','d']

和这样的列表:

List_vals1 = ['a','b']
List_vals2 = ['e','c','d']

我想在数据集中创建2个新变量,以查看数据集['变量']的值是否在每个列表中。

Dataset['Var_for_List_vals1'] = ['1','1','1','1','0','0','0']
Dataset['Var_for_List_vals2'] = ['0','0','0','0','1','1','1']

我试着这样做:

Dataset['Var_for_List_vals1'] = (Dataset[Dataset['Variable' in List_vals1]])*1 (times 1 to convert to numeric)

和python不喜欢那个解决方案。

这似乎是一个显而易见的但似乎没有什么对我有用。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用maplambda可以满足您的需求:

# I believe you want 1, 0 not '1', '0'.
Dataset['var_for_List_vals1'] = map(lambda x: 1 if x in List_vals1 else 0, Dataset['Variable'])
Dataset['var_for_List_vals1']
[1, 1, 1, 1, 0, 0, 0]

Dataset['var_for_List_vals2'] = map(lambda x: 1 if x in List_vals2 else 0, Dataset['Variable'])   
Dataset['var_for_List_vals2']
[0, 0, 0, 0, 1, 1, 1]

如果你确实想要' 1'和' 0'随时更改...(lambda x: '1' ... else '0')

答案 1 :(得分:1)

请注意,当数据维度变大时,使用map会比numpy.in1d方法慢得多:

In [1]:

import pandas as pd
import numpy as np
In [7]:

df = pd.DataFrame({'Variable': ['a','b','b','a','e','c','d']*100}) #700 lines of data
List_vals1 = ['a','b']
List_vals2 = ['e','c','d']
In [8]:

df['var_for_List_vals1'] = np.in1d(df.Variable, List_vals1)
#return Boolean values
In [9]:

%timeit np.in1d(df.Variable, List_vals1)
10000 loops, best of 3: 112 µs per loop
In [10]:

%timeit map(lambda x: 1 if x in List_vals1 else 0, df['Variable'])
1000 loops, best of 3: 287 µs per loop

请参阅文档here