Python SQL交叉应用的新版本

Python SQL交叉应用的新版本,python,sql,pandas,tsql,dataframe,Python,Sql,Pandas,Tsql,Dataframe,假设我们有一个数据帧df df = pd.DataFrame({ "Id": [1, 2], "Value": [2, 5] }) df Id Value 0 1 2 1 2 5 还有一些函数f,它接受df元素并返回一个数据帧 def f(value): return pd.DataFrame({"A": range(10, 10 + value), "B": range(20, 20 + value)}) f(2) A B 0

假设我们有一个数据帧
df

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

df
    Id  Value
0   1   2
1   2   5
还有一些函数
f
,它接受
df
元素并返回一个数据帧

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
,我们可以通过交叉应用来实现这一点:

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

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

您可以将该函数应用于列表理解中
Value
中的每个元素,并用于连接所有生成的数据帧。同时分配相应的
Id
,以便以后可以将其用于两个数据帧:

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

我会使用的少数案例之一。我们可以迭代每一行,使用原始数据帧从函数中提取笛卡尔积,同时使用和
fillna



这将产生:

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

可靠的回答。我对来自不同时间段的类似文件使用了这种方法,将数据聚合到一个大型数据结构中。谢谢——我本来打算使用这样的方法,但我认为可能有一种方法。不知道
分配
——handy。不客气@Denziloe!不要忘记,如果它为您解决了问题,您可以接受:)
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