遍历数据框并引用一系列

时间:2019-10-14 17:18:58

标签: python pandas loops numpy dataframe

我正在尝试遍历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 个答案:

答案 0 :(得分:2)

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

import numpy as np

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

答案 1 :(得分:0)

我认为应该是这样的:

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

如果需要,可以将结果从布尔值转换为整数。

答案 2 :(得分: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用于系列,df用于数据帧),并返回列名。因此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

我将打印出带有数据框df的输出以说明我的观点:

for row in df:
    print(row)

输出

Template
Prev
Swipe

答案 3 :(得分:0)

我能想到的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
  1. 使用numpy(例如上述答案之一已被指定):
    import numpy as np    
    s['Swipe'] = np.where((s['Template'] == 'detail page') & (s['Template'] == s['Prev']), 1, 0)
相关问题