2014-12-01 3 views
1

Я ищу лучший способ сделать следующее:создать новый столбец условного оператора без маски панд

    A  
TRDNumber  
ALB2008081610 430  
ALB200808167 0  
ALB200808168 190  

Создание нового столбца на основе значения в другой колонке, используя условный оператор

    A  B 
TRDNumber  
ALB2008081610 430  z 
ALB200808167 0  x 
ALB200808168 190  y 

Следующий код работает, но я знаю, что должен быть лучший способ сделать это.

mask = df['A'] == 0 
df20 = df[mask] 
df20['B'] = 'x' 
df20 

mask2 = ((df.A != 0) & (df.B <= 200)) 
df21 = df[mask2] 
df21['B'] = 'y' 
df21 

pieces = [df20,df21] 
pd.concat(pieces) 

ответ

1

Я думаю, что вы хотите сделать следующее:

#%% 
df = pd.DataFrame() 
df['A'] = pd.Series([430,0,190], index=['ALB2008081610', 'ALB200808167', 'ALB200808168']) 
print(df) 
#%% 
df['B'] = None 
print(df) 

#%% 
df.loc[(df.A==0), 'B'] = 'x' 
print(df) 

#%% 
df.loc[(df.A!=0) & (df.A<=200), 'B'] = 'y' 
print(df) 

Объяснение об индексации можно найти здесь: http://pandas.pydata.org/pandas-docs/stable/indexing.html

Совет в следующий раз: укажите код для создания данных , Затем мы можем напрямую играть с одним и тем же файлом данных, который вы используете.

1

Вы можете создать функцию и apply это набор данных:

>>> def foo(x): 
...  if x['A'] == 0: 
...   return 'x' 
...  elif x['A'] < 200: 
...   return 'y' 
...  else: 
...   return 'z' 
... 
>>> df['B'] = df.apply(foo, axis=1) 
>>> df 
       A B 
TRDNumber    
ALB2008081610 430 z 
ALB200808167  0 x 
ALB200808168 190 y 
Смежные вопросы