【发布时间】:2020-11-10 00:03:35
【问题描述】:
函数f(x,y) 接受两个 Pandas Series 并返回一个浮点数。我想将f 应用于DataFrame D 中的每一对列,并构造返回值的另一个DataFrame E,以便f(D[i],D[j]) 是ith 行和j 的值第列。直接的解决方案是在所有列对上运行嵌套循环:
E = pd.DataFrame([[f(D[i], D[j]) for i in D] for j in D],
columns=D.columns, index=D.columns)
但是有没有更优雅的解决方案可能不涉及显式循环?
注意这个问题不是this的骗子,尽管名字相似。
编辑一个玩具示例:
D = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]], columns=("a","b","c"))
def f(x,y): return x.dot(y)
E
# a b c
#a 66 78 90
#b 78 93 108
#c 90 108 126
【问题讨论】:
-
@Zero Sure,已添加。
-
pd.DataFrame({j: {i: f(D[i], D[j]) for i in D} for j in D})怎么样? -
@Zero 有什么不同?它使用相同的嵌套循环。
-
没错,它只是避免显式给出列和索引。
-
D.apply(lambda x: D.apply(lambda y: f(x, y)))也是循环的替代品,但你觉得它比你的更优雅吗?