python / pandas的新手,在循环中创建新列时遇到问题。 我想在循环的每次迭代中创建一个新列,并根据数据帧中的其他三个值是否都等于1来填充1(是)或0(是否)。在总共45列中进行了15次操作,并从循环中产生了15个新列,分别标记为'newCol'+一个数字(从0到14)。
我想在每次迭代循环时创建一个新列,并用订单号(在循环中运行时x的值)标记它,以便我可以跟踪检查了哪些列。
x = 0
label = 'newColumn',x
while x < 15:
label = 'newCol',x
#creates a new column with label that includes x
#populates with 1 or 0
df.loc[label] = np.where((df.iloc[:,x] == 1) & (df.iloc[:,x] == df.iloc[:,x+15]) & (df.iloc[:,x] == df.iloc[:,x+30]), 1, 0)
#increment x
x = x+1
如果我使用.info()查看它们,最终将产生这些列,但是我无法通过向前的任何索引访问它们。
我们非常感谢您的帮助!! 谢谢
答案 0 :(得分:1)
.loc
属性,用于进行索引/切片以及可能使用布尔索引来更改先前存在的值。如果您想创建一个新列,建议这样做:
x = 0
label = 'newColumn',x
while x < 15:
label = 'newCol',x
#creates a new column with label that includes x
#populates with 1 or 0
# do this instead
df[label] = np.where((df.iloc[:,x] == 1) & (df.iloc[:,x] == df.iloc[:,x+15]) & (df.iloc[:,x] == df.iloc[:,x+30]), 1, 0)
#increment x
x = x+1
您原来的方法实际上是向行而不是列添加索引。为避免这种情况,您可以使用上述方法。
@ alex-chojnacki提到的下一步是,您的label
是一个元组而不是字符串,这可能会使在代码中引用变得困难。
答案 1 :(得分:0)
我认为您遇到的问题是label = 'newColum',x
实际上不是返回字符串,而是返回一个元组。因此,您用来索引到df
的label的值实际上是第一次迭代时的("newCol", 0)
。
如果您改为将标签创建为字符串而不是元组,则应该可以。一种实现此目的的方法是label = "newCol" + str(x)
。