在 for 循环的每个循环中分配标签

Posted

技术标签:

【中文标题】在 for 循环的每个循环中分配标签【英文标题】:Assigning labels each cycle of a for loop 【发布时间】:2021-07-12 10:25:22 【问题描述】:

与How to add an empty column to a dataframe? 和Adding a new column to a df each cycle of a for loop 这些问题类似,我想在一列中添加新标签,最初初始化为 null,每个循环的 for 循环。

我有一个 10 行的初始数据集。在 for 循环中,在每个循环中,我都会添加更多行。我想为新行分配一个标签 0,以将它们与数据集中已有的原始行区分开来 (1)。

例如:

df = pd.DataFrame(d = 'a': [1,2,3], 'b': [5,6,7]) # Sample DataFrame

>>> df
   a  b
0  1  5
1  2  6
2  3  7

在开始 for 循环之前,我正在创建一个新列,将其值初始化为 1:

   a  b  Label
0  1  5  1
1  2  6  1 
2  3  7  1

第一次运行后,循环将新行添加到 df。如何将 Label=0 分配给这些行? 预期输出:

   a  b   Label
0  1  5     1
1  2  6     1 
2  3  7     1
3  4  8     0
4  5  9     0

...

我尝试如下:

df['Label']=1    
labels=df['Label']

         for x in difference: # I will need to assign a label 0 to rows not initially included in my original df. Since 5,6 and 7 are not in a, the first run is for x in (5,6,7). I will need to skip this first run otherwise I will assign 0 to my first three rows - that I had initialised to 1

           # omitted steps

            labels=0

df = pd.DataFrame("a": a_list, "b": b_list, "Labels": labels)

如前所述,difference 包含 b 中未包含在 a 中的所有值。 而不是预期的输出,我得到以下内容:

   a  b   Label
0  1  5     0
1  2  6     0 
2  3  7     0
3  4  8     0
4  5  9     0

...

问题是,目前labels = 0 的值也分配给了我的第一个原始行,因为循环也在为这些行运行,所以最初分配的值 1 被替换。

我认为一种方法可以是查看初始数据帧的长度(分配Label=1)并分配给大于该值0的行。在开头定义thrershold=len(df),然后在创建df之前使用新值,为小于阈值的行分配一个值1,否则为0。但我不知道如何处理行数来尝试这种方法。我认为 .loc 可以解决问题,但我不知道如何编写条件(可能低于初始长度的行,在for 循环之前定义)。

我在想这样的事情:

对于初始阈值内的那些行(即,我的 df 的 len),然后分配 1; 否则为 0。

这应该在我的代码中定义df 之后设置,以便创建一个考虑值的位置(行索引)的列。 我试过:df.iloc[0:int(len(df)), "Label"]=1,但它给了我一个错误:IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices

【问题讨论】:

你如何添加新行?你能把代码贴出来吗 不幸的是,我无法为此发布整个代码。但也可以考虑添加随机生成的值:np.random.randint(0,10),如果 b 中的值不在 a 中。 我认为另一种方法可能是查看初始数据帧的长度(分配 Label=1)并分配给大于 value=0 的行。在开始,并且在使用新值创建 df 之前,为小于阈值的行分配一个值 1,否则为 0。但我不知道如何处理行数来尝试这种方法 【参考方案1】:

保留原始索引的副本。向数据框添加新行后,使用布尔索引将新行Label 列分配给0

import pandas as pd

df = pd.DataFrame('a': [1,2,3], 'b': [5,6,7]) # Sample DataFrame

df['Label'] = 1

origin_index = df.index.tolist()

df = df.append(df, ignore_index=True)

df.loc[~df.index.isin(origin_index), 'Label'] = 0
print(df)

   a  b  Label
0  1  5      1
1  2  6      1
2  3  7      1
3  1  5      0
4  2  6      0
5  3  7      0

【讨论】:

以上是关于在 for 循环的每个循环中分配标签的主要内容,如果未能解决你的问题,请参考以下文章

如何在matlab中添加绘图标签循环[重复]

Django模板标签搜索通过for循环寻找特定对象,如果没有找到则默认

按标签引用 UIButton

JSTL标签之c:foreach,c:if标签小结

Pandas - 在循环中应用多索引标签

为啥在循环中更改此标签的 ForeColor 不会明显改变?