2017-04-01 60 views
0

我有一个数据帧(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 

但是当我打印数据帧时,它仍然不变

有人能让我知道我在做什么错吗?

谢谢

+1

'iterrows()'只返回单个发电机,'指数,row'是两个值。你想更新什么价值? ('df [index] ['3']'应该代表什么行和什么列?) – Chris

+0

你确定你的列名是字符串(“3”)而不是整数吗?当您尝试访问该列时,这可能会造成混淆。如果有疑问,请参阅您从打印中获得的内容(df.columns)。 – Craig

回答

1

通过更换您的最后一行:

df.at[index,'3'] = 1 

显然如其他人所说,你最好使用矢量化表达,而不是迭代,特别是大型dataframes。

+0

谢谢亚历克斯,如果我稍微修改df.at [index,3] = 1它是一种魅力 – Stacey

1

您不能通过迭代来修改数据帧。 See here.

如果你只是想在修改的元素[1,3],您可以直接访问它:

df[1, 3] = 1 

如果你想在列3每0求助于1,尝试这样的:

df[df['3'] == 0] = 1 

编辑:此外,docs for iterrows说,你经常会得到一个拷贝过来的,这就是为什么操作失败。

0

如果要更新基于具有一定值的行所有行的第三列,如图中的示例代码,那么这将是更容易使用where方法对数据帧:

df.loc[:,'3'] = df['3'].where(df['3']!=0, 1) 
0

尝试使用.loc或.iloc更新行(取决于您的需要)。
例如,在这种情况下:

if int(status) == 0: 
    df.iloc[index]['3']='1'