在不使用索引的情况下替换pandas DataFrame中所选单元格的值

Lon*_*Rob 38 python dataframe pandas

对于这个问题,这是一个相当类似的问题,但有一个关键的区别:我选择的数据不是通过索引而是通过某些标准来改变.

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

因此,没有将2009年周日的香蕉销量设定为100,而是没有任何反应!最好的方法是什么?理想情况下,解决方案应使用行号,因为您通常不提前知道!

非常感谢,Rob

wai*_*kuo 55

许多方法都是这样做的

1

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
Run Code Online (Sandbox Code Playgroud)

2

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
Run Code Online (Sandbox Code Playgroud)

3

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
Run Code Online (Sandbox Code Playgroud)

  • 是! 解决方案1.有效。有点违反直觉的行之有效:`d.sales [d.sales == 24] = 100`,但不起作用:`d [d.sales == 24] .sales = 100`。他们看起来(在功能上)与我相同。呃,好吧。谢谢@waitingkuo。 (2认同)
  • 仅供参考:这些现在将在0.13中提出/警告(见此处)[http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy) (2认同)

ram*_*ram 10

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

扩展@waitingkuo提供的答案,也可以根据多列的值完成相同的操作.

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100
Run Code Online (Sandbox Code Playgroud)


elP*_*tor 5

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

在这种情况下,代码将是:

d.sales = pd.np.where(d.sales == 24, 100, d.sales)
Run Code Online (Sandbox Code Playgroud)

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