这似乎是明显的答案,但......
我有一个这样的系列:
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不喜欢那个解决方案。
这似乎是一个显而易见的但似乎没有什么对我有用。在此先感谢您的帮助!
答案 0 :(得分:1)
使用map
和lambda
可以满足您的需求:
# 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