Цикл по фрейму данных и ссылка на серию - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь перебрать фрейм данных в python и в своем операторе if я ссылаюсь на пару столбцов, которые оказались Series. Когда я запускаю свой код, я получаю следующую ошибку:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Данные :
Взято из решения, предоставленного @ CypherX.

template = ['some', 'abra', 'cadabra', 'juju', 'detail page', 'lulu', 'boo', 'honolulu', 'detail page']
prev = ['home', 'abra', 'cacobra', 'juju', 'detail page', 'lulu', 'booboo', 'picabo', 'detail here']
df = pd.DataFrame({'Template': template, 'Prev': prev})
      Template         Prev
0         some         home
1         abra         abra
2      cadabra      cacobra
3         juju         juju
4  detail page  detail page
5         lulu         lulu
6          boo       booboo
7     honolulu       picabo
8  detail page  detail here

Мой код следующий:

for row in s:
    if (s['Template']=='detail page') and (s['Template']==s['Prev']):
        s['Swipe']=1
    else:
        s['Swipe']=0

, где s - мой фрейм данных.

Что я могу сделать, чтобы это исправить? Есть идеи?

Ответы [ 4 ]

2 голосов
/ 14 октября 2019

Вы можете попробовать установить значение s['Swipe'], используя np.where вместо:

import numpy as np

s['Swipe'] = np.where((s['Template'] == 'detail page') & (s['Template'] == s['Prev']), 1, 0)
0 голосов
/ 14 октября 2019

2 быстрых способа, которыми я могу придумать:

  1. Без использования numpy
    s['Swipe'].loc[(s['Template']=='detail page') & (s['Template']==s['Prev'])]=1
    s['Swipe'].loc[(s['Template']!='detail page') | (s['Template']!=s['Prev'])]=0
Используя numpy (как, например, один из приведенных выше ответов):
    import numpy as np    
    s['Swipe'] = np.where((s['Template'] == 'detail page') & (s['Template'] == s['Prev']), 1, 0)
0 голосов
/ 14 октября 2019

Поскольку вы не предоставили никаких воспроизводимых данных о проблемах, я создал их самостоятельно, и вот решение.

Краткое решение

condition = ((df.Template==df.Prev) & (df.Template=='detail page'))
df['Swipe'] = condition.astype(int)

Подробное решение

Оцените условие как boolean, и, поскольку вы хотите присвоить 1 для True и 0 для False, достаточно выполнить преобразование из boolean в int.

# Prepare Dummy Data
template = ['some', 'abra', 'cadabra', 'juju', 'detail page', 'lulu', 'boo', 'honolulu', 'detail page']
prev = ['home', 'abra', 'cacobra', 'juju', 'detail page', 'lulu', 'booboo', 'picabo', 'detail here']
df = pd.DataFrame({'Template': template, 'Prev': prev})

# Evaluate Condition
condition = ((df.Template==df.Prev) & (df.Template=='detail page'))
df['Swipe'] = condition.astype(int)

print(df)

Вывод :

      Template         Prev  Swipe
0         some         home      0
1         abra         abra      0
2      cadabra      cacobra      0
3         juju         juju      0
4  detail page  detail page      1
5         lulu         lulu      0
6          boo       booboo      0
7     honolulu       picabo      0
8  detail page  detail here      0

В чем была проблема в вашем решении?

  1. Ваш код перебирает кадр данных s (примечание: обычно s используется для рядов и df для фрейма данных) и возвращает имена столбцов. Таким образом, row на самом деле не будет возвращать строки кадра данных.
  2. Даже если у вас была информация о строке, вы не используете row нигде в коде, внутри цикла for.
for row in s:
    if (s['Template']=='detail page') and (s['Template']==s['Prev']):
        s['Swipe']=1
    else:
        s['Swipe']=0

Я распечатаю выводс фреймом данных df, чтобы сделать мою точку зрения:

for row in df:
    print(row)

Вывод :

Template
Prev
Swipe
0 голосов
/ 14 октября 2019

Я думаю, что это будет примерно так:

s['Swipe'] = (s['Template'] == 'detail page') & (s['Template'] == s['Prev'])

Вы можете преобразовать результат из логического значения в int, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...