在pandas数据框中动态定义新列

时间:2019-01-25 12:16:05

标签: python pandas

说我定义以下数据框:

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或类似内容的软件包吗?

谢谢

2 个答案:

答案 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)

使用DataFrame.eval

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()