我有很长的字符串列表。这些字符串是我要保留在数据框中的那些列。但是,此列表中有几个与列标题不匹配的字符串,而是与我要执行的两个或多个列标题之间的操作匹配。
示例:
df = @A @B @C @D @E @F
1 2 3 4 5 6
9 8 7 6 5 4
1 3 5 7 9 11
list = ["@A", "@C", "@D / @F"]
我想要这样输出:
@A @C @D/@F
1 3 0.667
9 7 1.5
1 5 0.63
但是,我无法为自己的生活弄清楚该怎么做。
为了使事情变得更复杂,有时在我的列表中您可能会看到示例中的简单除法,有时您可能会看到"(C + D) / (A + F)"
中更复杂的东西。我该怎么办?
老实说,我不知道从哪里开始。我以为我可以做df [list]之类的事情,而熊猫只是“知道”该怎么做,但我想我可能会问的太多了!
任何帮助将不胜感激!谢谢。
编辑: 尝试使用eval()方法后,我遇到了另一个问题。虽然这可能不是问题,但是我的大多数字符串都以字符“ @”开头,当传递给eval函数时会引发错误。我将对如何解决此问题进行一些谷歌搜索,但是也欢迎任何其他帮助。
编辑2:
我想出了解决@问题的方法。我只是使用了replace()方法。
lst = [word.replace("@", "") for word in lst]
然后,我对所有列也都这样做。
答案 0 :(得分:1)
通常,需要编写一个简单的解析器来进行操作。但是Python提供了一种可以解决您的问题的方法:eval()
。
从这个other answer,我们可以得出以下结论:
>>> var = {'a':np.array([1,2,2]),'b':np.array([2,1,3]),'c':np.array([3])}
>>> formula = '2*a*(b/c)**2'
>>> eval(formula, var)
array([ 0.8889, 0.4444, 4. ])
因此,如果您首先在格式良好的字典中定义每列,那么它应该可以按预期工作。
例如:
var = {'A': df[0], 'B':df[1], ...}
eval(list[0], var)
不过,在使用eval()
时要小心。如果您不是将变量提供给方法的人,那可能是dangerous。
希望有帮助!
答案 1 :(得分:0)
注释:切勿使用list
作为列表名,这是Python中的保留字。我将其更改为lst
lst = ["A", "C", "D / F"]
df = pd.DataFrame(df.eval(lst).T, columns=lst)
输出
A C D / F
0 1 3 0.666667
1 9 7 1.5
2 1 5 0.636364
如果我们通过更复杂的计算扩展您的lst
,则此方法仍然适用:
lst = ["A", "C", "D / F", "(C + D) / (A + F)"]
df = pd.DataFrame(df.eval(lst).T, columns=lst)
输出
A C D / F (C + D) / (A + F)
0 1 3 0.666667 1
1 9 7 1.5 1
2 1 5 0.636364 1