在DataFrame上使用where

时间:2015-03-25 19:10:19

标签: python pandas dataframe

我似乎无法一步到位地弄清楚如何做到这一点。我想将偶数条目设置为1,将奇数条目设置为-1:

df = DataFrame(np.arange(16).reshape(4,4))
x1 = df.where(df%2==0, -1)
x2 = x1.where(df%2!=0, 1)

pandas.DataFrame.where的文档说:

  

返回与self相同形状的对象及其对应的条目   来自于自我,其中cond是真的,否则来自其他。

这是唯一的方法吗?

3 个答案:

答案 0 :(得分:1)

我们可以使用np.where来使用布尔条件将值设置为true,并在false时将值设置为备用值。这将返回一个numpy数组,如果你想作为df,你必须作为arg传递给df ctor:

In [31]:

df = pd.DataFrame(np.where(df%2==0,-1,1))
df
Out[31]:
   0  1  2  3
0 -1  1 -1  1
1 -1  1 -1  1
2 -1  1 -1  1
3 -1  1 -1  1

答案 1 :(得分:1)

对于整个数据框,在一行中:

In [34]: df = pd.DataFrame(randint(0,8,size=(3,3)))

In [35]: df
Out[35]: 
   0  1  2
0  3  4  1
1  3  3  1
2  7  7  3

In [37]: df = ((df%2)-0.5)*-2

In [38]: df
Out[38]: 
   0  1  2
0 -1  1 -1
1 -1 -1 -1
2 -1 -1 -1

按栏:

df = pd.DataFrame([list('addfg'),list('LKJHU')]).T
df.Odds = ((df.index.values%2)-0.5)*-2

结果:

   0  1  Odds
0  a  L     1
1  d  K    -1
2  d  J     1
3  f  H    -1
4  g  U     1

答案 2 :(得分:1)

numpy.choose在这里很有用。

from pandas import DataFrame
import numpy as np
df = DataFrame(np.arange(16).reshape(4,4))
np.choose(df%2, [1, -1])
=> 
   0  1  2  3
0  1 -1  1 -1
1  1 -1  1 -1
2  1 -1  1 -1
3  1 -1  1 -1

第二个arg是要替换的值列表。 index = 0处的值替换值== 0等的位置