我现有的数据框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.
是否有任何优雅而紧凑的方式添加此列?
答案 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