zip参数1在通过zip循环时必须支持迭代错误

2024-09-28 22:11:06 发布

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

我几乎没有看到其他类似的问题报告,但我无法复制我的情况下的解决方案。

我的问题更简单,因为我有一个数字列表和一个字符串列表

number = [21, 44, 31, 553, 63, 35]
access = ["denied", "Try Again", "Retry", "Accepted", "Error", "Success"]

我压缩了它们并创建了一对,每个值如下

testInput = zip(number, access)

output: 
[(21, 'denied'), (44, 'Try Again'), (31, 'Retry'), (553, 'Accepted'), (63, 'Error'), (35, 'Success')]

我试图遍历每一对并执行我的函数,该函数根据对的值将它们映射到一个团队名称。我的尝试是:

def mapping(number, access):
    team = ''
    checkNumberAndAccess = zip(number, access)
    for number, access in checkNumberAndAccess:
        if number in range(20,30):
            team = 'Revolt'
        elif (number in range(40,50)) and (access == 'Try Again'):
            team = 'Strike'
        elif (number in range(60,100)) and (access == 'Error'):
            team = 'Exception'
    print team
    return team

我希望“Team”变量保存每对的映射输出值,因此这是我执行函数的地方:

for number, access in testInput:
    Team = mapping(number, access)
    df = df.append({'Access Message': access, 'Number': number}, ignore_index=True)
print df

在执行映射函数时,出现“TypeError:zip argument#1 must support iteration”错误。是不是放错地方了?

完整代码:

import pandas as pd

df = pd.DataFrame()


number = [21, 44, 31, 553, 63, 35]
access = ["denied", "Try Again", "Retry", "Accepted", "Error", "Success"]


def mapping(number, access):
    team = ''
    checkNumberAndAccess = zip(number, access)
    for number, access in checkNumberAndAccess:
        if number in range(20,30):
            team = 'Revolt'
        elif (number in range(40,50)) and (access == 'Try Again'):
            team = 'Strike'
        elif (number in range(60,100)) and (access == 'Error'):
            team = 'Exception'
    print team
    return team


testInput = zip(number, access)
print testInput

for number, access in testInput:
    Team = mapping(number, access)
    df = df.append({'Access Message': access, 'Number': number}, ignore_index=True)
print df

Tags: innumberdfforaccessrangeerrorzip
2条回答

熊猫解决方案呢?

number = [21, 44, 31, 553, 63, 35]
access = ["denied", "Try Again", "Retry", "Accepted", "Error", "Success"]

#create DataFrame
df = pd.DataFrame({'number':number, 'access':access})

#create boolean masks
m1 =  df['number'].isin(range(20,30))
m2 =  df['number'].isin(range(40,50)) & (df['access'] == 'Try Again')
m3 =  df['number'].isin(range(60,100)) & (df['access'] == 'Error')

#create new column by conditions
df['Access Message'] = np.select([m1, m2,m3], ['Revolt','Strike','Exception'], default='')
print (df)
      access  number Access Message
0     denied      21         Revolt
1  Try Again      44         Strike
2      Retry      31               
3   Accepted     553               
4      Error      63      Exception
5    Success      35               

在您的解决方案中,可以在循环中将输出附加到list,最后由构造函数创建DataFrame

number = [21, 44, 31, 553, 63, 35]
access = ["denied", "Try Again", "Retry", "Accepted", "Error", "Success"]

def mapping(number, access):
    out = []
    checkNumberAndAccess = zip(number, access)
    for number, access in checkNumberAndAccess:
        if number in range(20,30):
            out.append('Revolt')
        elif (number in range(40,50)) and (access == 'Try Again'):
            out.append('Strike')
        elif (number in range(60,100)) and (access == 'Error'):
            out.append('Exception')
        else:
            #add default value  
            out.append('')
    return out

access = mapping(number, access)

df = pd.DataFrame({'Access Message': access, 'Number': number})
print (df)
  Access Message  Number
0         Revolt      21
1         Strike      44
2                     31
3                    553
4      Exception      63
5                     35

试试这个。

import pandas as pd

df = pd.DataFrame()


number = [21, 44, 31, 553, 63, 35]
access = ["denied", "Try Again", "Retry", "Accepted", "Error", "Success"]


def mapping(number, access):
    team = ''

    if number in range(20,30):
        team = 'Revolt'
    elif (number in range(40,50)) and (access == 'Try Again'):
        team = 'Strike'
    elif (number in range(60,100)) and (access == 'Error'):
        team = 'Exception'
    print team
    return team


testInput = zip(number, access)
print testInput

for number, access in testInput:
    Team = mapping(number, access)
    df = df.append({'Access Message': access, 'Number': number}, ignore_index=True)
print df

或者您可以从这里传递总列表并压缩到那里,处理并将最终结果返回给调用函数

相关问题 更多 >