【问题标题】:How to avoid repeating expressions when analysing data?分析数据时如何避免重复表达?
【发布时间】:2020-11-16 06:15:48
【问题描述】:

我是编程新手,被要求编写一些代码来分析 NoSQL 数据库并制作仪表板。该任务涉及生成满足特定条件的行数。

我决定扫描我的数据库,将其放入 pandas 数据框中并在其上运行 .query() 以提高可读性。我也听说过熊猫速度的好消息。但是,我需要多次重复我的代码才能获得所需的所有字段,例如:

data1=df.query("a > 0").shape[0]  
data2=df.query("a > 0 & d=='yes'").shape[0]  
data3=df.query("a > 0 & d=='no'").shape[0]

使用 if 语句会变得更糟。有没有一种更少重复、更干燥的方式来做到这一点?我想出的一件事是下面的伪代码中的“表达式表”。有没有办法在 python 中做类似的事情?或者更好的东西?

                where a > 0    where b > 0     where c == 1
all results        3                7              5
where d=='yes'     1                3              4
where d=='no'      2                4              1

【问题讨论】:

    标签: python pandas dataframe nosql expression


    【解决方案1】:

    我建议将重复的部分提取到一个函数中:

    def get_result_size(cond1, cond2):
        return df.query(f"{cond1} & {cond2}").shape[0]
    

    然后你可以将你的第一个例子重写为

    data1=get_result_size("a > 0", 'True')
    data2=get_result_size("a > 0", "d=='yes'")
    data3=get_result_size("a > 0", "d=='no'")
    

    要生成结果表,您可以编写两个循环,一个在另一个循环中。外循环遍历您的行。内部循环遍历列。

    请注意,像这样使用 query() 效率不高 - Pandas 会多次重新计算同一事物。例如,上面的代码对整个数据帧评估a > 0 3 次,即使它只需要执行一次。不过,这对您的应用程序来说可能没问题。

    【讨论】:

    • 谢谢!你能告诉我更多关于我的效率吗?像这样的东西? data1=df.query("a > 0")data1a=data1.shape[0]data1b=data1.query("d=='yes'").shape[0]data1c=data1.query("d=='no'").shape[0]
    • 是的,这样会更有效率,但是给你的变量命名。有一句臭名昭著的名言:“始终编写代码,就好像最终维护您的代码的人将是一个知道您住在哪里的暴力精神病患者。”
    • 我最终这样做了,并使用了漂亮的变量名,还为不同的阶段添加了 cmets。现在可以安全睡觉了;)
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2017-07-16
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多