【问题标题】:pandas version of SQL CROSS APPLYPandas 版本的 SQL CROSS APPLY
【发布时间】:2019-09-07 13:50:23
【问题描述】:

假设我们有一个 DataFrame df

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

df
    Id  Value
0   1   2
1   2   5

还有一些函数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

我们想将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

在 T-SQL 中,使用表 df 和表值函数 f,我们将使用 CROSS APPLY 来执行此操作:

SELECT * FROM df
CROSS APPLY f(df.Value)

我们如何在pandas 中做到这一点?

【问题讨论】:

    标签: python sql pandas tsql dataframe


    【解决方案1】:

    您可以在列表理解中将该函数应用于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
    

    【讨论】:

    • 可靠的答案。我稍微用这种方法处理不同时间段的类似文件,将数据聚合成一个大数据结构。
    • 谢谢——我打算使用这样的方法,但我认为可能有一种 pandas 方法。不知道assign——很方便。
    • 不客气@Denziloe!如果它为您解决了,请不要忘记您可以接受:)
    【解决方案2】:

    我会使用DataFrame.iterrows 的少数情况之一。我们可以遍历每一行,将笛卡尔积与原始数据框连接到您的函数之外,同时将fillnabfillffill 连接起来:


    df = pd.concat([pd.concat([f(r['Value']), pd.DataFrame(r).T], axis=1).bfill().ffill() for _, r in df.iterrows()], 
                   ignore_index=True)
    

    产量:

    print(df)
        A   B   Id  Value
    0  10  20  1.0    2.0
    1  11  21  1.0    2.0
    2  10  20  2.0    5.0
    3  11  21  2.0    5.0
    4  12  22  2.0    5.0
    5  13  23  2.0    5.0
    6  14  24  2.0    5.0
    

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多