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