当前位置: 首页 > 知识库问答 >
问题:

在不使用索引的情况下替换熊猫数据帧中选定单元格的值

姜运珧
2023-03-14

这是一个与这个问题非常相似的问题,但有一个关键的区别:我选择的数据我想改变的不是它的索引,而是一些标准。

如果我应用的条件返回一行,我希望能够以一种简单的方式设置该行中某一列的值,但是我的第一次尝试不起作用:

>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009], 
...                   'flavour':['strawberry','strawberry','banana','banana',
...                   'strawberry','strawberry','banana','banana'],
...                   'day':['sat','sun','sat','sun','sat','sun','sat','sun'],
...                   'sales':[10,12,22,23,11,13,23,24]})

>>> d
   day     flavour  sales  year
0  sat  strawberry     10  2008
1  sun  strawberry     12  2008
2  sat      banana     22  2008
3  sun      banana     23  2008
4  sat  strawberry     11  2009
5  sun  strawberry     13  2009
6  sat      banana     23  2009
7  sun      banana     24  2009

>>> d[d.sales==24]
   day flavour  sales  year
7  sun  banana     24  2009

>>> d[d.sales==24].sales = 100
>>> d
   day     flavour  sales  year
0  sat  strawberry     10  2008
1  sun  strawberry     12  2008
2  sat      banana     22  2008
3  sun      banana     23  2008
4  sat  strawberry     11  2009
5  sun  strawberry     13  2009
6  sat      banana     23  2009
7  sun      banana     24  2009

因此,与其将2009年周日的香蕉销量设定为100,还不如什么都不发生!做这件事最好的方法是什么?理想情况下,解决方案应该使用行号,因为您通常事先不知道!

共有3个答案

桑博远
2023-03-14

老问题,但我很惊讶没有人提到numpy的.where()功能(可以直接从pandas模块调用)。

在这种情况下,代码为:

d.sales = pd.np.where(d.sales == 24, 100, d.sales)

据我所知,这是跨系列有条件地更改数据的最快方法之一。

宁兴修
2023-03-14

不确定旧版本的熊猫,但在0.16中,可以根据多个列值设置特定单元格的值。

扩展@waitingkuo提供的答案,同样的操作也可以基于多个列的值来完成。

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100
尤俊誉
2023-03-14

有很多方法可以做到这一点

In [7]: d.sales[d.sales==24] = 100

In [8]: d
Out[8]: 
   day     flavour  sales  year
0  sat  strawberry     10  2008
1  sun  strawberry     12  2008
2  sat      banana     22  2008
3  sun      banana     23  2008
4  sat  strawberry     11  2009
5  sun  strawberry     13  2009
6  sat      banana     23  2009
7  sun      banana    100  2009
In [26]: d.loc[d.sales == 12, 'sales'] = 99

In [27]: d
Out[27]: 
   day     flavour  sales  year
0  sat  strawberry     10  2008
1  sun  strawberry     99  2008
2  sat      banana     22  2008
3  sun      banana     23  2008
4  sat  strawberry     11  2009
5  sun  strawberry     13  2009
6  sat      banana     23  2009
7  sun      banana    100  2009
In [28]: d.sales = d.sales.replace(23, 24)

In [29]: d
Out[29]: 
   day     flavour  sales  year
0  sat  strawberry     10  2008
1  sun  strawberry     99  2008
2  sat      banana     22  2008
3  sun      banana     24  2008
4  sat  strawberry     11  2009
5  sun  strawberry     13  2009
6  sat      banana     24  2009
7  sun      banana    100  2009
 类似资料:
  • 问题内容: 这是一个与该问题 “在pandas DataFrame中为特定单元格设置值”)非常相似的问题,但有一个主要区别:我选择的数据不是按其索引而是按某些条件进行更改。 如果我应用的条件返回一行,我希望能够以一种简单的方式设置该行中某个列的值,但是我的第一次尝试不起作用: 因此,与其将2009年周日的香蕉销量设置为100,没有任何反应!最好的方法是什么?理想情况下,解决方案应使用行号,因为您通

  • 我想更改我的熊猫数据框架中的一个值,我想我误解了索引的工作方式。 我得到输出 我想将df中的值0.665873更改为1。我试过了 但我得到了错误 我试图用示例数据帧复制该问题,但无济于事。 我认为问题在于,当我使用实际数据时,我得到了一系列的输出,但当我使用实践数据时,得到了一个浮点。为什么我得到的是这个系列而不是浮点0.665873?

  • 我已经根据这个遮阳篷尝试过这个 但这给了我警告: 我很难将此代码转换为使用 .loc 属性。有人可以告诉我如何将此代码转换为使用.loc并摆脱警告吗? 谢谢大家!

  • 我有两个数据帧:df1和df2。df1有列['UserId'、'company'、'deg'],有100个观察值。df2有列['UserId','deg',],有10个观察值。df1和df2中的索引与“userId”完全匹配。 我想用df2中的更新df1。df2中的“UserId”列是df1中“UserId”列的子集……因此,没有任何附加内容。仅基于“userId”(和/或普通索引)。 df1 d

  • 拿到这个了 然后我要为特定单元格赋值,例如为行“C”和列“X”赋值。我已经料到会有这样的结果: 使用此代码:

  • 我有一个多索引数据框,看起来像 uid tid文本 abc x t1 bcd y t2 uid 和 tid 是索引。我有一个 uid 列表,并希望获取与该列表中的 uid 相对应的行,但保留第 2 级索引值 (tid)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?