试图更新数据帧

时间:2017-04-01 20:43:44

标签: python pandas

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

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

有人能让我知道我做错了吗?

由于

4 个答案:

答案 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'