鉴于以下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] ...有没有更有效的方法来处理这个问题?
答案 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)