Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不使用索引的情况下替换数据帧中选定单元格的值_Python_Pandas_Dataframe - Fatal编程技术网

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

Python 在不使用索引的情况下替换数据帧中选定单元格的值,python,pandas,dataframe,Python,Pandas,Dataframe,这是一个非常类似的问题,但有一个关键的区别:我选择的数据,我想改变的不是它的索引,而是一些标准 如果我应用的条件返回一行,我希望能够以简单的方式设置该行中某一列的值,但我的第一次尝试不起作用: >>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009], ... 'flavour':['strawberry','strawberry','banana','ba

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

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

>>> 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,还不如什么都没发生!最好的方法是什么?理想情况下,解决方案应该使用行号,因为您通常事先不知道

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

1. 2. 3.
不确定pandas的旧版本,但在0.16中,可以基于多个列值设置特定单元格的值

扩展@waitingkuo提供的答案,也可以基于多个列的值执行相同的操作

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100

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

在这种情况下,代码为:

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

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

是!解决方案1。工作。这有点违反直觉:
d.sales[d.sales==24]=100
,但事实并非如此:
d[d.sales==24]。sales=100
。它们在我看来(功能上)是一样的。好吧。谢谢@waitingkuo.d[d.sales==24]生成一个新的object.re@waitingkuo评论:熊猫们,这是预期的行为吗?当然不直观地认为
d[d.sales==24]
应该生成原始
数据帧的副本。事实上,除非用户明确要求(通过某种类型的
copy=True
),否则每个对象都应该是对原始对象的引用(包括选择一行,正确地“折叠”到一个系列)。想法?仅供参考:这些现在将在0.13中引发/警告请参见(此处)[)@Jeff如何处理这些警告,或者有没有其他正确的方法可以在没有警告的情况下做到这一点?
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
d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100
d.sales = pd.np.where(d.sales == 24, 100, d.sales)