2015-09-16 2 views
3

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

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'Var1': np.random.rand(10), 'Var2': np.random.rand(10)}) 
cuts = 'Var1 < 0.8 & Var2 < 0.8' 

То, что я хочу добавить столбец, называемый 'Decision', который проверяет, является ли условие разрезов True или False. Следующий код в точности то, что я хочу:

df["Decision"] = np.logical_and(df.Var1 < 0.8, df.Var2 < 0.8) 

Если я так, мне нужно, чтобы преобразовать строку в df.foo методов, кажется, довольно трудно для меня из-за мои ничтожные навыки регулярных выражений ... Есть ли возможность для достижения того, что я хочу прямо из строки?

Заранее благодарен!

ответ

2

Использование np.where для создания вашей колонки:

In [2]: 
df = pd.DataFrame({'Var1': np.random.rand(10), 'Var2': np.random.rand(10)}) 
df 

Out[2]: 
     Var1  Var2 
0 0.982730 0.370334 
1 0.269056 0.099330 
2 0.697314 0.204711 
3 0.272982 0.647933 
4 0.096770 0.111819 
5 0.278602 0.353552 
6 0.959481 0.566532 
7 0.552109 0.973224 
8 0.563421 0.298835 
9 0.395232 0.968710 

In [5]:  
df['Decision'] = np.where((df['Var1'] < 0.8) & (df['Var2'] < 0.8), True, False) 
df 

Out[5]: 
     Var1  Var2 Decision 
0 0.982730 0.370334 False 
1 0.269056 0.099330  True 
2 0.697314 0.204711  True 
3 0.272982 0.647933  True 
4 0.096770 0.111819  True 
5 0.278602 0.353552  True 
6 0.959481 0.566532 False 
7 0.552109 0.973224 False 
8 0.563421 0.298835  True 
9 0.395232 0.968710 False 

Здесь np.where вернется True, когда условие выполняется и False иначе

Если вы хотите использовать cuts строку, то вы можете использовать query с loc вам нужно использовать isin с индексом и инвертировать булевую маску с использованием ~, чтобы установить строки False:

In [16]: 
cuts = "(Var1 < 0.8) & (Var2 < 0.8)" 
df.loc[df.query(cuts).index, 'Decision'] = True 
df.loc[~df.index.isin(df.query(cuts).index), 'Decision'] = False 
df 

Out[16]: 
     Var1  Var2 Decision 
0 0.982730 0.370334 False 
1 0.269056 0.099330  True 
2 0.697314 0.204711  True 
3 0.272982 0.647933  True 
4 0.096770 0.111819  True 
5 0.278602 0.353552  True 
6 0.959481 0.566532 False 
7 0.552109 0.973224 False 
8 0.563421 0.298835  True 
9 0.395232 0.968710 False 
+0

Да, это похоже на приятное решение. Но как преобразовать '' (Var1 <0,8) & (Var2 <0,8) "' в '(df ['Var1'] <0,8) & (df ['Var2'] <0,8)'? – Timon

+0

Вы можете сделать 'df.query (cuts)', но это вернет только положительные строки, но вы можете использовать это, чтобы установить значения столбца, я обновлю, чтобы показать вам – EdChum

Смежные вопросы