Python ';int';“对象不可编辑”;当使用itertools并对每行应用函数时

Python ';int';“对象不可编辑”;当使用itertools并对每行应用函数时,python,pandas,Python,Pandas,我有以下数据集: index REWARD (1,1,1) 0 (1,2,3) 0 (1,1,3) 0 如果索引有一对数字,我想将奖励设置为2。所以输出应该是 index REWARD (1,1,1) 0 (1,2,3) 0 (1,1,3) 2 当我使用这个代码时 def set_reward(final): for i in final['index']: tempCount=[]

我有以下数据集:

index    REWARD  
(1,1,1)   0
(1,2,3)   0
(1,1,3)   0
如果索引有一对数字,我想将奖励设置为2。所以输出应该是

index    REWARD  
(1,1,1)   0
(1,2,3)   0
(1,1,3)   2
当我使用这个代码时

  def set_reward(final):
        for i in final['index']:
            tempCount=[]
            for item,count in collections.Counter((i)).items():
                tempCount.append(count)
            if tempCount==[2, 1] or tempCount==[1, 2]:
                final['REWARD']=2
            return final['REWARD']
    final['REWARD']=final.apply(set_reward,axis=1)
它说“int”对象是不可编辑的“


有什么方法可以解决这个问题吗?

您可以在不使用显式for循环和条件逻辑的情况下获得所需的结果。请尝试以下方法:

# Example data
df = pd.DataFrame({'index':  [(1, 1, 1), (1, 2, 3), (1, 1, 3)], 
                   'REWARD': [0, 0, 2]})


# Select any row whose index contains at least one pair of values
mask = df['index'].apply(lambda x: 2 in Counter(x).values())

df.loc[mask, 'REWARD'] = 2

df
       index  REWARD
0  (1, 1, 1)       0
1  (1, 2, 3)       0
2  (1, 1, 3)       2

无需显式for循环和条件逻辑即可获得所需的结果。请尝试以下操作:

# Example data
df = pd.DataFrame({'index':  [(1, 1, 1), (1, 2, 3), (1, 1, 3)], 
                   'REWARD': [0, 0, 2]})


# Select any row whose index contains at least one pair of values
mask = df['index'].apply(lambda x: 2 in Counter(x).values())

df.loc[mask, 'REWARD'] = 2

df
       index  REWARD
0  (1, 1, 1)       0
1  (1, 2, 3)       0
2  (1, 1, 3)       2

如果您正在搜索
2,1
1,2
这里
1,3
如何获得奖励?您的意思是在这个示例中,模式应该是
1,3
?不清楚您所说的“索引有一对数字”是什么意思“。可能您可以再举几个不同索引值的示例,以及您希望捕获哪些索引值?或者用简单的英语详细描述你想要捕获的内容?如果你正在搜索
2,1
1,2
那么
1,3
如何在这里获得奖励?你的意思是在这个例子中,模式应该是
1,3
?不清楚你所说的“索引有一对数字”是什么意思。也许您可以再举几个不同索引值的例子,以及您想要捕获哪些索引值?或者用简单的英语详细描述你想要捕获的内容?谢谢,但问题是,我想改变索引的大小并搜索成对、集合或2对。这就是我使用collections.Counter((I))的原因。如果索引由3个元素组成,我希望对数字对有[2,1]这样的模式;如果索引由5个元素组成,则对两个重复的数字对有[2,2,1]这样的模式。我知道了,我修改了答案,使用
集合。计数器
,查找索引至少包含一对的任何行。也许性能不是很好,但它可以在足够小的数据集上工作。谢谢,这就是我想要的。我使用mask=final['index'].apply(lambda x:[2,1]==collections.Counter(x).values()),它可以工作,但是如果我想要两个列表与collections.Counter(x).values()匹配呢?我如何在这里使用或声明?我需要这样的smth:mask=final['index'].apply(lambda x:[2,1]或[1,2]==collections.Counter(x).values())谢谢,但问题是,我想更改索引的大小并搜索pair、set或2对。这就是我使用collections.Counter((I))的原因。如果索引由3个元素组成,我希望对数字对有[2,1]这样的模式;如果索引由5个元素组成,则对两个重复的数字对有[2,2,1]这样的模式。我知道了,我修改了答案,使用
集合。计数器
,查找索引至少包含一对的任何行。也许性能不是很好,但它可以在足够小的数据集上工作。谢谢,这就是我想要的。我使用mask=final['index'].apply(lambda x:[2,1]==collections.Counter(x).values()),它可以工作,但是如果我想要两个列表与collections.Counter(x).values()匹配呢?我如何在这里使用或声明?我需要这样的smth:mask=final['index'].apply(lambda x:[2,1]或[1,2]==collections.Counter(x).values())