我有一个数据框(df),如下所示:
0 1 2 3
0 BBG.apples.S BBG.XNGS.bananas.S 0
1 BBG.apples.S BBG.XNGS.oranges.S 0
2 BBG.apples.S BBG.XNGS.pairs.S 0
3 BBG.apples.S BBG.XNGS.mango.S 0
4 BBG.apples.S BBG.XNYS.mango.S 0
5 BBG.XNGS.bananas.S BBG.XNGS.oranges.S 0
6 BBG.XNGS.bananas.S BBG.XNGS.pairs.S 0
7 BBG.XNGS.bananas.S BBG.XNGS.kiwi.S 0
8 BBG.XNGS.oranges.S BBG.XNGS.pairs.S 0
9 BBG.XNGS.oranges.S BBG.XNGS.kiwi.S 0
10 BBG.XNGS.peaches.S BBG.XNGS.strawberrys.S 0
11 BBG.XNGS.peaches.S BBG.XNGS.strawberrys.S 0
12 BBG.XNGS.peaches.S BBG.XNGS.strawberrys.S 0
13 BBG.XNGS.peaches.S BBG.XNGS.kiwi.S 0
我正在尝试使用以下方法更新数据框中的值(第一行,第三列)
for index, row in df.iterrows():
status = row[3]
if int(status) == 0:
df[index]['3'] = 1
但是当我打印出数据帧时,它仍然是不变的
有人能让我知道我做错了吗?
由于
答案 0 :(得分:1)
您不能通过这样迭代来修改数据框。 See here.
如果您只想修改[1,3]中的元素,可以直接访问它:
df[1, 3] = 1
如果您尝试将第3列中的每个0
转换为1
,请尝试以下操作:
df[df['3'] == 0] = 1
编辑:此外,docs for iterrows
表示您经常会收到副本,这就是操作失败的原因。
答案 1 :(得分:1)
将您的最后一行替换为:
df.at[index,'3'] = 1
显然正如其他人所提到的,你最好使用矢量化表达而不是迭代,特别是对于大型数据帧。
答案 2 :(得分:0)
如果您尝试根据具有特定值的行更新所有行的第三列,如示例代码所示,那么在数据框上使用where
方法会更容易:< / p>
df.loc[:,'3'] = df['3'].where(df['3']!=0, 1)
答案 3 :(得分:0)
尝试使用.loc或.iloc更新行(取决于您的需要)。
例如,在这种情况下:
if int(status) == 0:
df.iloc[index]['3']='1'