Power BI:如何在Power Query Editor中使用Python处理多个表格?

17

如何使用Python脚本创建一个新表,该表使用两个现有表作为输入?例如,通过使用 Pandas合并执行左连接?

一些细节:

使用 Home > Edit queries 您可以在 Transform > Run Python Script 下使用Python。这将打开一个 Run Python Script 对话框,其中告诉您 '#dataset' holds the input data for this script。如果您只是点击 OK 并查看公式栏,您会发现同样的短语:

= Python.Execute("# 'dataset' holds the input data for this script#(lf)",[dataset=#"Changed Type"])

这还在 Applied Steps 下添加了一个名为 Run Python script 的新步骤,您可以通过单击右侧的齿轮符号来编辑Python脚本:

enter image description here

如何更改该设置以引用多个表?


示例数据

以下是两个表,可以存储为CSV文件并使用 Home > Get Data > Text/CSV 加载:

Table1

Date,Value1
2108-10-12,1
2108-10-13,2
2108-10-14,3
2108-10-15,4
2108-10-16,5

表2

Date,Value2
2108-10-12,10
2108-10-13,11
2108-10-14,12
2108-10-15,13
2108-10-16,14
2个回答

34
这是与R脚本相同的挑战此处所描述的。该设置也适用于Python。然而,我发现该方法有一个缺点:它将新的连接或计算表存储为先前表格的编辑版本之一。以下建议将演示如何生成完全新的计算表,而不更改输入表(除了由于this而将日期列的数据类型从日期更改为文本)。
简短回答:
Power Query Editor中,请按照以下步骤进行:
  1. 将两个日期列的数据类型更改为。

  2. 点击输入数据点击确定

  3. 激活新的Table3并使用Transform > Run Python Script点击确定

  4. 激活公式栏,并用= Python.Execute("# Python:",[df1=Table1, df2=Table2])替换其中的内容。点击Enter

  5. 如果提示这样做,请单击编辑权限和下一步中的运行

  6. 应用步骤下,在名为Run Python Script的新步骤中,单击齿轮图标以打开Run Python Script编辑器。

  7. 插入下面的代码片段,然后单击确定

代码:

import pandas as pd
df3 = pd.merge(df1, df2, how = 'left', on = ['Date'])
df3['Value3'] = df1['Value1']*df2['Value2']

df3 旁边,点击 Table,就完成了:

enter image description here

细节:

为了使事情顺利进行,必须非常仔细地遵循上面的列表。以下是所有肮脏的小细节:

1. 使用获取数据在Power BI Desktop中将表格作为CSV文件加载。

2. 点击编辑查询

3.Table1中,点击Date列旁边的符号,选择文本并点击替换当前

enter image description here

4. 对于Table2执行同样的操作。

5.主页选项卡中,点击输入数据

6. 在弹出的框中,除了点击确定之外,不要进行其他操作。

enter image description here

7. 这将在Queries下插入一个名为Table3的空表,这正是我们想要的:

enter image description here

8. 进入Transform选项卡,点击Run Python Script

enter image description here

9. 这将打开运行Python脚本编辑器。你可以在这里开始编写脚本,但这会使接下来的步骤变得不必要地复杂。因此,除了单击确定之外,不要做任何事情:

enter image description here

10. 在公式栏中,您将看到以下公式= Python.Execute("# 'dataset' holds the input data for this script#(lf)",[dataset=#"Changed Type"])。请注意,在应用的步骤下面,您有一个名为Run Python Script的新步骤:

enter image description here

11. 上面的截图中有几个有趣的细节,但首先我们要分解函数= Python.Execute("# 'dataset' holds the input data for this script#(lf)",[dataset=#"Changed Type"])的参数。

"# 'dataset'" holds the input data for this script#(lf)"部分只是插入了你可以在Python Script Editor中看到的注释。因此它并不重要,但你也不能把它留空。我喜欢使用一些更短的东西,比如"# Python:"

[dataset=#"Changed Type"]部分是指向Changed Type状态下空的Table3的指针。因此,如果在插入Python脚本之前做的最后一件事情不是更改数据类型,这部分将会有所不同。然后,在你的python脚本中使用dataset作为pandas数据帧来使表格可用。有了这个想法,我们可以对公式进行一些非常有用的更改:

12. 将公式栏更改为= Python.Execute("# Python:",[df1=Table1, df2=Table2]),然后按Enter。这将使Table1Table2作为两个名为df1df2的pandas数据帧在你的Python脚本中可用。

13. 点击Applied StepsRun Python script旁边的齿轮(或是花朵?)图标:

enter image description here

14. 插入以下片段:

代码:

import pandas as pd
df3 = pd.merge(df1, df2, how = 'left', on = ['Date'])
df3['Value3'] = df1['Value1']*df2['Value2']

这将在“Date column”上连接“df1”和“df2”,并插入一个名为“Value3”的新计算列。虽然不太花哨,但使用此设置,您可以利用Power BI和Python的强大功能对数据进行任何操作。

enter image description here

15. 点击OK,你将看到这个:

enter image description here

在蓝色方框中,您将看到df3列在输入数据框df1df2下面。如果您在Python脚本的计算步骤中分配了其他数据帧,它们也会在此处列出。为了将其转换为Power BI可访问的表格,只需单击绿色箭头所示的Table

16. 就是这样:

enter image description here

请注意,{{Date列}}的数据类型默认设置为{{Date}},但您可以像之前解释的那样将其更改为{{Text}}。
单击{{Home > Close&Apply}}退出{{Power Query Editor}}并返回到{{Power BI Desktop}}中开始的位置。

2
非常好用,谢谢伙计。唯一的问题是这个在云端如何执行?或者它能在云端执行吗?比如当我的数据刷新时,Python脚本也会运行吗?如果是这样,它会从哪里运行?因为目前它是从我的本地机器运行的(甚至不能使用虚拟环境...难过)。 - Umar.H
1
@Datanovice,你肯定在问正确的问题!!!Python的灵活性在PowerBI中似乎仍然非常有限。当我开始在PowerBI中尝试它时,你所问的肯定是不可能的。老实说,我不确定现在的情况如何... - vestland
1
我明白了,那么只在桌面上进行操作是有道理的(这样任何类型的ETL都没有用),但对于一次性的操作或POC测试来说是不错的选择,然后再转移到databricks或其他工具上。 - Umar.H
1
@Datanovice 有时候我就是喜欢错的!!Power BI Service中的Python可视化 - vestland
2
我按照这里列出的步骤进行操作,但是当我到达第12步(更改公式栏以访问不同的数据集)时,我遇到了以下错误:“Formula.Firewall:查询'Table1'(步骤'Run Python script')引用其他查询或步骤,因此它可能无法直接访问数据源。请重新构建此数据组合。”是否有解决方法? - AJHello
显示剩余5条评论

8
你可以创建一个空白查询,然后在高级编辑器中替换其内容。
let
    Source = Python.Execute("# Python:#(lf)",[df1=Table1, df2=Table2])
in
    Source

您可以单击源旁边的齿轮,添加您的Python代码,其中可以使用df1和df2。


简单而有效。 - srodriguex
1
@srodriguex 我遇到了这个错误 -- Formula.Firewall: 查询 'Table' (步骤 'Source') 引用了其他查询或步骤,因此可能无法直接访问数据源。请重新构建此数据组合。 - derikS4M1
@derikS4M1,您需要从当前文件的选项中禁用隐私级别检查(文件-->选项和设置-->选项-->[当前文件/隐私]-->忽略隐私级别并可能提高性能)。然后刷新您的报告。 - lucazav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接