使用字符串列表操作熊猫列

时间:2019-07-16 13:07:42

标签: python-3.x pandas

我有很长的字符串列表。这些字符串是我要保留在数据框中的那些列。但是,此列表中有几个与列标题不匹配的字符串,而是与我要执行的两个或多个列标题之间的操作匹配。

示例:

   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]

然后,我对所有列也都这样做。

2 个答案:

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

使用DataFrame.eval

注释:切勿使用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