我有以下数据框:
col1 col2
0 a 7
1 b 3
2 c 1
3 d 6
我正在尝试向数据框添加新列,其值等于变量x
。此变量将取决于col1
和col2
的值。我尝试过:
for row in df:
row['col3'] = x
但是我遇到以下错误:
TypeError: 'tuple' object does not support item assignment
我看了看
iterrows()
,但是我不确定这是正确的方法。根据文档:
“永远不要修改要迭代的内容。不能保证在所有情况下都能正常工作。根据数据类型,迭代器将返回副本而不是视图,并且对其进行写入将无效。”
编辑-其他信息:
我想做的是创建一个新的数据框,其中col3
是基于数据框的预排序顺序的字符串。例如,以下数据框:
col1 col2
0 a 7
1 b 3
2 c 1
3 d 6
应成为:
col1 col2 col 3
0 a 7 001
1 b 3 002
2 c 1 003
3 d 6 004
col3
是格式为'000'的字符串(即,在适用情况下使用前导零,因此该字符串始终包含3个字符)。数据框中的行数永远不会超过999。
这是我到目前为止的代码:
x = 1
for row in df:
if x < 10:
formatting = str('00' + str(x))
elif x < 100:
formatting = str('0' + str(x))
else:
formatting = str(str(x))
x += 1
row['col3'] = x
但是,这似乎更改了数据框中所有行的col3
值,仅改变了循环中的行。例如,在4个循环之后,结果为:
col1 col2 col 3
0 a 7 004
1 b 3 004
2 c 1 004
3 d 6 004
答案 0 :(得分:1)
编辑:
这里最好使用Series.str.zfill
,并将索引值转换为字符串:
df['col3'] = (df.index + 1).astype('str').str.zfill(3)
print (df)
col1 col2 col3
0 a 7 001
1 b 3 002
2 c 1 003
3 d 6 004
如果索引不是默认的RangeIndex,则创建帮助器Series
:
df['col3'] = pd.Series(np.arange(1, len(df) + 1)).astype('str').str.zfill(3)