2017-04-01 59 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'