Pandas将if-then语句应用于矩阵df

时间:2018-01-25 20:19:07

标签: python pandas matrix

鉴于以下df:

Name Id   v1 v2 v3 ...
A    1    1  3  5  ...
B    2    2  4  6  ...

我想将这些条件应用于列v1到v3 ...:

如果值< = 2则a

如果2<值< = 5然后b

如果值> 5然后c

Name Id   v1 v2 v3 ...
A    1    a  b  b  ...
B    2    a  b  c  ...

我会使用像df [v1] = np.where(df [v1]< = 2,a,np.where(df [v1]< = 5,b,c))然后重复相同的东西对于df [v2] df [v3] ...有没有更有效的方法来处理这个问题?

3 个答案:

答案 0 :(得分:3)

选项1
您使用np.where走在正确的轨道上,但您可以一次设置所有内容,而不是一次设置一列。

v = df.iloc[:, 2:].values

df.iloc[:, 2:] = np.where(
        v <= 2, 'a', np.where((2 < v) & (v <= 5), 'b', 'c')
)    
df

  Name  Id v1 v2 v3
0    A   1  a  b  b
1    B   2  a  b  c

选项2
如果您喜欢冒险,那么还有np.select -

df.iloc[:, 2:] = np.select([v <= 2, (2 < v) & (v <= 5)], ['a', 'b'], default='c')
df

  Name  Id v1 v2 v3
0    A   1  a  b  b
1    B   2  a  b  c

答案 1 :(得分:2)

您只需要pd.cut

df.iloc[:,2:]=df.iloc[:,2:].apply(lambda x : pd.cut(x,bins=[-np.inf,2,5,np.inf],labels = ['a','b','c']),1)
df
Out[817]: 
  Name  Id v1 v2 v3
0    A   1  a  b  b
1    B   2  a  b  c

答案 2 :(得分:1)

另一种方法是定义要应用的函数,然后将其应用于您感兴趣的列。然后,您可以将这些相同的列设置为由新值覆盖。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))

def function(value):
    if value <= 2:
        return 'a'

    if 2 < value <= 5:
        return 'b'

    if value > 5:
        return 'c'

df[['A', 'B']] = df[['A', 'B']].applymap(function)