说我定义以下数据框:
df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print(df.head())
并且我想通过对现有列使用某种条件来生成新列
df['XXX'] = df.AAA < 6
print(df.head())
其中生成的输出将是:
AAA BBB CCC XXX
0 4 10 100 True
1 5 20 50 True
2 6 30 -30 False
3 7 40 -50 False
我希望能够动态生成这些条件,例如通过传递类似
"AAA < 6"
或
"AAA < 4 & BBB == 10"
并对这些条件进行相应的评估。
熊猫提供某种机制来允许类似这样的事情吗?我知道eval()可以替代,但还要注意,上述字符串也需要提供df作为上下文,即:“ AAA <6” =>“ df.AAA <6”
或者,有人可以向我推荐一个可以让我定义这些条件,然后生成可以用于评估的lambda或类似内容的软件包吗?
谢谢
答案 0 :(得分:3)
您可以使用pandas的eval
,它可以评估描述操作的字符串:
cond = "AAA < 6"
df.eval(cond)
0 True
1 True
2 False
3 False
Name: AAA, dtype: bool
cond = "AAA < 6"
df.assign(XXX = df.eval(cond))
AAA BBB CCC XXX
0 4 10 100 True
1 5 20 50 True
2 6 30 -30 False
3 7 40 -50 False
cond = "AAA < 4 & BBB == 10"
df.assign(XXX = df.eval(cond))
AAA BBB CCC XXX
0 4 10 100 False
1 5 20 50 False
2 6 30 -30 False
3 7 40 -50 False
答案 1 :(得分:2)
df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
df['a'] = df.eval("AAA < 5 & BBB == 10")
df['b'] = df.eval("AAA < 6")
df['c'] = df.eval("AAA < 4 & BBB == 10")
print (df)
AAA BBB CCC a b c
0 4 10 100 True True False
1 5 20 50 False True False
2 6 30 -30 False False False
3 7 40 -50 False False False
有关将此功能与替代方法结合使用的更多信息,是Dynamic Expression Evaluation in pandas using pd.eval()