在数据帧上循环并引用序列

2024-06-01 02:19:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python中迭代一个数据帧,在if语句中,我引用了碰巧是一个系列的两列。运行代码时,出现以下错误:

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是我的数据帧。你知道吗

我能做些什么来解决这个问题?有什么想法吗?你知道吗


Tags: 数据代码ifpagetemplatesomejujudetail
3条回答

我能想到的两个快速方法:

  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
  1. 使用numpy(就像上面的答案之一已经指定的那样):
    import numpy as np    
    s['Swipe'] = np.where((s['Template'] == 'detail page') & (s['Template'] == s['Prev']), 1, 0)

因为,你没有提供任何可复制的问题数据,我自己做了,这里是解决办法。你知道吗

短期解决方案

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

详细解决方案

将条件求值为boolean,由于要为True赋值1,为False赋值0,只需将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用于series,df用于dataframe),并返回列名。因此row实际上不会返回数据帧的行。你知道吗
  2. 即使您有行信息,也不会在代码中的任何地方、for循环内使用row。你知道吗
for row in s:
    if (s['Template']=='detail page') and (s['Template']==s['Prev']):
        s['Swipe']=1
    else:
        s['Swipe']=0

我将用dataframe df打印输出以表明我的观点:

for row in df:
    print(row)

输出

Template
Prev
Swipe

您可以尝试使用np.where来设置s['Swipe']的值:

import numpy as np

s['Swipe'] = np.where((s['Template'] == 'detail page') & (s['Template'] == s['Prev']), 1, 0)

相关问题 更多 >