【问题标题】:python assign variables from values in a listpython从列表中的值分配变量
【发布时间】:2020-02-25 19:27:54
【问题描述】:

我有一个要作为列表导入的 csv 文件

[["df['EPS Rating']>=97"],
 ["df['RS Rating']>=97"],
 ["df['Ind Group RS']<=9"],
 ["df['SMR Rating']<=2"],
 ["df['AD Rating']<=9"],
 ["df['Comp Rating']>=85"],
 ["df['Current Price']>=15"]]

我想像这样将这些分配给变量 c1 到 c7

c1 = df['EPS Rating']>=97
c2 = df['RS Rating']>=97
c3 = df['Ind Group RS']<=9
c4 = df['SMR Rating']<=2
c5 = df['AD Rating']<=9
c6 = df['Comp Rating']>=85
c7 = df['Current Price']>=15

这样我就可以使用 Gecko here 找到的这个出色的解决方案,如下所示。虽然这个解决方案在我的情况下非常适合可读性,但它最终会变得很大,因为我有 30 多个这样的过滤器,而且许多有超过 20 个条件。如何将列表中的字符串分配给变量?

可能是这样的吗?

For i to end_of_list:
    c[i] = [i].value

我希望这能解释我想要做什么。我是 python 新手,所以我还是有点迷茫。我不喜欢这个想法,所以如果有人有更好的解决方案,我很想知道。谢谢

Geckos 原始解决方案:

import numpy as np
import functools
def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)

c_1 = data.col1 == True
c_2 = data.col2 < 64
c_3 = data.col3 != 4

data_filtered = data[conjunction(c1,c2,c3)]

【问题讨论】:

  • 为什么需要存储到变量中?
  • 以便它们可以与 Gecko 的原始解决方案一起使用
  • 我在这里看到的问题是,在您的情况下,您将数据帧表达式列表作为字符串导入,并且在您发布的解决方案中,conjuction 函数被应用于这些表达式的求值。在您的情况下,实际的 DataFrame 对象是如何计算的?

标签: python pandas dataframe variables filter


【解决方案1】:

试试这个:

strings = [["df['EPS Rating']>=97"],
 ["df['RS Rating']>=97"],
 ["df['Ind Group RS']<=9"],
 ["df['SMR Rating']<=2"],
 ["df['AD Rating']<=9"],
 ["df['Comp Rating']>=85"],
 ["df['Current Price']>=15"]]

filters = []
for i in strings:
    filters.append(eval(i[0]))

data_filtered = df[conjunction(*filters)]

您可以将conjunction 函数传递给一个列表,只要您将其就地解压,就像这里所做的那样。

注意:这假设您在运行之前已在代码中的某处初始化了实际的 DataFrame 对象 df


编辑:FWIW,这个解决方案将完全按照您的要求,创建动态分配的变量来保存字符串中表达式的评估:

for i in range(len(g)):
    x = 'c_{}'.format(i)
    exec('{} = {}'.format(x,g[i][0].strip("\"")))

但以这种方式实例化变量(没有明确的赋值语句)通常是一种糟糕的做法(有关详细信息,请参阅link)。

【讨论】:

  • 第一个解决方案正是我什至不知道自己在寻找的解决方案。它工作得很好。还要感谢您包含第二个以及为什么这不是一个好主意的链接。非常感谢您的帮助。
【解决方案2】:

IIUC,你可以把每一项都放在字典里。

filter_dict = {}
counter = 1
for item in your_list:
    for i in item:
        filter_dict[f'C{counter}'] = i 
        counter += 1

print(filter_dict)

{'C1': "df['EPS Rating']>=97",
 'C2': "df['RS Rating']>=97",
 'C3': "df['Ind Group RS']<=9",
 'C4': "df['SMR Rating']<=2",
 'C5': "df['AD Rating']<=9",
 'C6': "df['Comp Rating']>=85",
 'C7': "df['Current Price']>=15"}

这为您提供了对象的字符串版本,您必须使用 eval 才能在您的函数中使用它。

import numpy as np
import functools

def conjunction(*conditions):
    return functools.reduce(np.logical_and, conditions)



df[conjunction([eval(x) for x in filter_dict.values()])

请注意,如果您的数据框中不存在该对象,eval 将导致错误。

【讨论】:

  • 虽然我无法让它工作,但它实际上给了我一个想法来解决我正在处理的其他问题,所以谢谢。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多