Python,在现有的cols上创建新的col调节

时间:2016-12-08 19:13:08

标签: python pandas

我现有的数据框df中有3列:A,B,C

我想基于A,B,C添加另一个col D

逻辑是:

if (A == "a"):
    D = "a"
elif (A == "b") and (B in ["B", "C"]):
    D = "A"
elif (C == "c"):
    D = "c"
Note: the value of D can be NaN if all conditions are not satisfied.

是否有任何优雅而紧凑的方式添加此列?

3 个答案:

答案 0 :(得分:4)

嵌套在哪里应该是最快的

np.where(df.A == 'a', 'a', 
         np.where((df.A == 'b') & (df.B.isin(['B','C'])), 'A',
         np.where(df.C == 'c', 'c', np.nan)))

速度测试

# create 100,000 rows of random data
df = pd.DataFrame({'A':np.random.choice(['a','b','c','A','B','C'], 100000, True),
               'B':np.random.choice(['a','b','c','A','B','C'], 100000, True), 
               'C':np.random.choice(['a','b','c','A','B','C'], 100000, True)})

%%timeit 
np.where(df.A == 'a', 'a', 
     np.where((df.A == 'b') & (df.B.isin(['B','C'])), 'A',
     np.where(df.C == 'c', 'c', np.nan)))

10个循环,最佳3:33.4 ms每循环

def my_logic(x):
    if x[0] == 'a':
        return 'a'
    elif x[0] == 'b' and x[1] in ('B', 'C'):
        return 'A'
    elif x[2] == 'c':
        return 'c'
    return ''

%%timeit
df[['A', 'B', 'C']].apply(my_logic, axis=1)

1个循环,最佳3:5.87秒/循环

嵌套在哪里比apply快175倍 - 最后的方法。

答案 1 :(得分:0)

我认为这是最易读的方法,但仍然有些紧凑。

def my_logic(x):
    if x[0] == 'a':
        return 'a'
    elif x[0] == 'b' and x[1] in ('B', 'C'):
        return 'A'
    elif x[2] == 'c':
        return 'c'
    return ''

df['D'] = df[['A', 'B', 'C']].apply(my_logic, axis=1)

答案 2 :(得分:0)

这比if / elif解决方案和更少的线路更快。然而,它可以说是不可读的。

df.loc[df.A=="a", "D") = "a"
df.loc[(df.A=="b") & df.B.isin("B", "C"), "D") = "A"
df.loc[(df.C=="c") & ~df.A.isin("a", "A"), "D"] = "c"
df.loc[~df.D.isin("a", "A", "c"), "D"] = np.nan