尝试更新数据框
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'
【讨论】:
以上是关于尝试更新数据框的主要内容,如果未能解决你的问题,请参考以下文章