尝试更新数据框

Posted

技术标签:

【中文标题】尝试更新数据框【英文标题】:Trying to update a dataframe 【发布时间】:2017-08-26 23:21:45 【问题描述】:

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

但是当我打印出数据框时,它保持不变。

我做错了什么?

【问题讨论】:

iterrows() 只返回一个生成器,index,row 是两个值。您要更新什么值? (df[index]['3']应该代表哪一行哪一列?) 您确定您的列名是字符串 ('3') 而不是整数?当您尝试访问该列时,这可能会导致混乱。如果有疑问,请查看您从 print(df.columns) 中得到什么。 【参考方案1】:

您不能通过这样的迭代来修改数据框。 See here.

如果只想修改[1, 3]处的元素,可以直接访问:

df[1, 3] = 1

如果您尝试将第 3 列中的每个 0 转换为 1,请尝试以下操作:

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

编辑:此外,docs for iterrows 说您经常会得到一份副本,这就是操作失败的原因。

【讨论】:

【参考方案2】:

将最后一行替换为:

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

显然,正如其他人所提到的,您最好使用矢量化表达式而不是迭代,尤其是对于大型数据帧。

【讨论】:

谢谢亚历克斯,如果我稍微修改一下 df.at[index,3] = 1 它会很有魅力【参考方案3】:

如果您尝试根据具有特定值的行更新所有行的第三列,如示例代码中所示,那么在数据帧上使用 where 方法会容易得多:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于尝试更新数据框的主要内容,如果未能解决你的问题,请参考以下文章

更新 pyspark 的数据框列

根据另一列值更新数据框的列

下拉框数据未实时更新

Python Pandas,尝试更新单元格值

使用 json 模式更新 spark 数据框中的列

更新文本框后面的数据表?