2016-02-13 4 views
1

У меня есть dataframe df какНазначить значения в серии Pandas на основе условия?

A B 
1 2 
3 4 

Затем я хочу, чтобы создать 2 новые серии

t = pd.Series() 
r = pd.Series() 

я смог присвоить значения t используя условие cond ниже

t = "1+" + df.A.astype(str) + '+' + df.B.astype(str) 
cond = df['A']<df['B'] 
team[cond] = "1+" + df.loc[cond,'B'].astype(str) + '+' + df.loc[cond,'A'].astype(str) 

Но у меня проблемы с r. Я просто хочу r содержать значения 2, когда con выполнено и 1 в противном случае

Если я просто пытаюсь

r = 1 
r[cond] = 2 

Тогда я получаю TypeError: 'int' object does not support item assignment

Я полагаю, что я мог бы просто запустить цикл через df и проверьте случаи в cond через каждую строку df, но мне было интересно, если Pandas предлагает более эффективный способ вместо этого?

ответ

2

Вы будете смеяться, как легко это:

r = cond + 1 

Причина заключается в том, что cond является логическим (True и False), которые оценивают в 1 и 0. Если вы добавите к он, он забирает логическое значение в int, что будет означать, что True отображает 2 и False на один.

df = pd.DataFrame({'A': [1, 3, 4], 
        'B': [2, 4, 3]}) 

cond = df['A'] < df['B'] 

>>> cond + 1 
0 2 
1 2 
2 1 
dtype: int64 
+0

спасибо, что сработало – user5739619

0

При назначении 1 до г, как и в

r = 1 

г Теперь ссылается на целое число 1. Таким образом, при вызове г [Cond] вы лечащему целое, как ряд.

Вы хотите сначала создать серию из них для r размера cond. Что-то вроде

r = pd.Series(np.ones(cond.shape)) 
+0

если я пытаюсь 'г = pd.Series (np.ones (df.shape))', я получаю 'Исключение: Данные должны быть 1-мерным ' – user5739619

+0

Я думаю, что я должен работать, используя ' len (df.index) 'вместо' shape'. Однако 'r [cond] = 2' не работает. Почему это? – user5739619

+0

Можете ли вы попробовать его как 'r = np.ones (cond.shape)' вместо 'pd.Series (np.ones (df.shape))'? –