2015-12-09 2 views
1

У меня есть dataframe с (в данном примере), 2 строки и dataframe выглядит как это:Понимание строки итерации в панд (питон)

PERON START END 
AB  100  120 
CC  110  115 

(То, что я хочу, но это не вопрос у меня есть, чтобы сделать новый столбец с флагом для каждой строки, если «СТАРТ» - «END», равна 20) (я также имел аналогичные проблемы в других потребительных случаях)

(я пробовал

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0 

Я также попытался:

for i in df.iterrows(): 
    print i[0] 
    if abs(df.START-df.END)==20: 
     print 'Legit to make be a flag' 

Проблема: Каждый раз, когда я получаю сообщение «Значение истинности серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.all().

Я понимаю, что если вы не проходите через каждую строку, python не знает для которого значение сравнивается с «if-statement», поэтому вы используете a.any(), если хотите дать флаг, если хотя бы одна строка удовлетворяет условию if-statement. a.all(), если все строки должны соответствовать строкам-условию ...

Теперь мой вопрос: Почему питон не проверяет, если-заявление на пропашной основе (конечно, в для цикла) и сохраняют это дает мне " Значение истинности серии неоднозначно. Используйте a.empty, a.bool(), a.item(), a.any() или a.All() "- Ошибка

Другая постановка вопроса: Почему питона в". для i в df.iterrows(): «все еще выполняется выражение if на всем уровне данных данных по очереди за строкой.

Поскольку в приведенном ниже коде печатается, что цикл for находится в строке ' 0' , так что я бы предположить, питон будет делать, если заявление по строке „0“. Но это не проверить, если заявление для этой строки, потому что он дает мне „неоднозначные ошибки thruth значение“ ...

for i in df.iterrows(): 
    print i[0] 

Я посмотрел на «using-if-truth-statements-with-pandas» -документацию и некоторые другие вопросы о стеке, но я не могу понять, где я ошибаюсь (маловероятно, потому что я все еще в фазе python-noob).

+0

Вы хотите новый столбец с логическим значением (True или False), если df.START-df.END равен 20? Это вопрос? –

+0

Вопрос в основном почему в «df.itterows, за которым следует оператор if», почему оператор if все еще выполняется на всем уровне данных данных – 5nv

+1

Потому что это то, что вы написали. (Нет. * I * in 'if abs (df.START-df.END) == 20:') – pacholik

ответ

1

Это вниз, как панды векторизации операций, где это возможно.

abs(df.START-df.END) ==20 

сам возвращает серию. Эта серия колонка вы ищете:

>>> df = pd.DataFrame([[100,120],[110,115]],index=['AB','CC'],columns=['START','END']) 
... df 
... abs(df.START-df.END)==20 
13: AB  True 
CC False 
dtype: bool 

Наблюдайте:

>>> df['New'] = abs(df.START-df.END)==20 
>>> df 
15:  START END New 
AB 100 120 True 
CC 110 115 False 

панда предназначена для такого рода работы.

Вы не должны быть разочарованы, поскольку оба ваши попытки были довольно близки:

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0) 

нарушается, потому что абс (df.START-df.END) == 20 возвращается в серию. Для каждой строки эта лямбда спрашивает, является ли сериал «Истина», следовательно, ошибка.

Если вместо этого, вы имели:

df['New']= df.apply(lambda x: 1 if abs(x.START-x.END)==20 else 0, axis =1) 

это будет желаемого результата, так как ABS (x.START-x.END) == 20 возвращает булево, а не серия.

+0

>>> Почему python в «for i в df.iterrows():« все еще выполняется if-statement на всем уровне данных данных, а не в строке за строкой. , потому что у вас есть df в инструкции if, а не i! По возможности воспользуйтесь использованием векторизации панд. необходимо использовать .apply() или .iterrows() –

+1

Спасибо, очень ясный ответ с объяснением r этнинг серии. Это помогло мне понять основные подходы к этим операциям (которые я хотел знать ...) – 5nv

0

Как насчет:

df.loc[:,'Flag'] = abs(df.START-df.END)==20 
+0

Спасибо, что делает флаг, который я также хотел, но мой вопрос был больше о df.iterrows() и почему он не делает, t выполнить if-statement на основе строки. Извините за мою плохую формулировку моего вопроса ... Но еще раз спасибо ... – 5nv

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