为了简化我的问题,我说有两个列表列表和一个如下所示的函数:
OP = [[1,2,3],[6,2,7,4],[4,1],[8,2,6,3,1],[6,2,3,1,5], [3,1],[3,2,5,4]]
AP = [[2,4], [2,3,1]]
def f(listA, listB):
return len(listA+listB) # my real f returns a number as well
我想获得f(OP[i],AP[j]) for each i, j
,所以我的想法是创建一个pandas.Dataframe
,如下所示:
AP[0] AP[1]
OP[0] f(AP[0],OP[0]) f(AP[1],OP[0])
OP[1] f(AP[0],OP[1]) f(AP[1],OP[1])
OP[2] f(AP[0],OP[2]) f(AP[1],OP[2])
OP[3] f(AP[0],OP[3]) f(AP[1],OP[3])
OP[4] f(AP[0],OP[4]) f(AP[1],OP[4])
OP[5] f(AP[0],OP[5]) f(AP[1],OP[5])
OP[6] f(AP[0],OP[6]) f(AP[1],OP[6])
我的实际数据实际上在OP中有大约80,000个列表,在AP中有20个列表,并且函数f
有点耗时,因此应该担心计算成本。
我实现目标的想法是为每个pandas.Series
构建len(AP)
长度OP
,然后将Series
附加到最终Dataframe
。
例如,对于OP[0]
,首先创建一个Series
,其中包含f(OP[0],AP[i]) for each i
的所有信息。
我被迫构建Series
。我尝试了pandas.Series.apply()
和map()
,但由于我的函数f
需要两个参数,因此它们都没有工作。
我也欢迎任何其他建议f(OP[i],AP[j]) for each i, j
,谢谢。
答案 0 :(得分:1)
你可以使用一些嵌套的list comprehension,然后应用pandas.DataFrame.from_records
:
import pandas as pd
records = [tuple(f(A, O) for A in AP) for O in OP]
pd.DataFrame.from_records(records)