熊猫版的SQL CROSS APPLY

Den*_*loe 3 python sql t-sql dataframe pandas

假设我们有一个DataFrame df

df = pd.DataFrame({
    "Id": [1, 2],
    "Value": [2, 5]
})

df
    Id  Value
0   1   2
1   2   5
Run Code Online (Sandbox Code Playgroud)

还有一些函数f需要一个元素df并返回一个DataFrame。

def f(value):
    return pd.DataFrame({"A": range(10, 10 + value), "B": range(20, 20 + value)})

f(2)
    A   B
0   10  20
1   11  21
Run Code Online (Sandbox Code Playgroud)

我们希望将应用于f中的每个元素df["Value"],并将结果连接到中df,如下所示:

    Id  Value   A   B
0   1   2       10  20
1   1   2       11  21
2   2   5       10  20
2   2   5       11  21
2   2   5       12  22
2   2   5       13  23
2   2   5       14  24
Run Code Online (Sandbox Code Playgroud)

在T-SQL中,使用表df和表值函数f,我们可以使用CROSS APPLY来做到这一点:

SELECT * FROM df
CROSS APPLY f(df.Value)
Run Code Online (Sandbox Code Playgroud)

我们如何才能做到这一点pandas

yat*_*atu 6

您可以将函数应用于Value列表pd.concat推导中的每个元素,并用于连接所有结果数据框。还要分配相应的内容,Id以便以后可以用于merge两个数据帧:

l = pd.concat([f(row.Value).assign(Id=row.Id) for _, row in df.iterrows()])
df.merge(l, on='Id')

   Id   Value  A   B
0   1      2  10  20
1   1      2  11  21
2   2      5  10  20
3   2      5  11  21
4   2      5  12  22
5   2      5  13  23
6   2      5  14  24
Run Code Online (Sandbox Code Playgroud)

  • 肯定的答案。我对来自不同时间段的相似文件使用了这种方法,以将数据聚合为大型数据结构。 (2认同)