我有两个列表,正在尝试使用dataframe
在pandas
中创建所有可能的乘法结果的矩阵。
解释
>>> L1
[8, 1, 4, 2, 7, 5]
>>> L2
[5, 3, 9, 1, 2, 6]
我将L1
中的每个项目与来自L2
的每个项目相乘,以制定所有可能的结果:
>>> [[a*b] for a in L1 for b in L2]
[[40], [24], [72], [8], [16], [48], [5], [3], [9], [1], [2], [6], [20], [12], [36], [4], [8], [24], [10], [6], [18], [2], [4], [12], [35], [21], [63], [7], [14], [42], [25], [15], [45], [5], [10], [30]]
预期产出/目标:
我的目标是现在使用pandas 将这些值表示为矩阵,但我不知道从哪里开始。列表中的第一项由0-5
分配列/行名称。
例如:
df
矩阵应该类似于:
0 1 2 3 4 5
0 40 5 20 10 35 25
1 24 3 12 6 21 15
2 72 9 36 18 63 45
3 8 1 4 2 7 5
4 16 2 8 4 14 10
5 48 6 24 12 42 30
答案 0 :(得分:7)
您可以考虑使用numpy.outer
:
In [879]: pd.DataFrame(np.outer(L2, L1))
Out[879]:
0 1 2 3 4 5
0 40 5 20 10 35 25
1 24 3 12 6 21 15
2 72 9 36 18 63 45
3 8 1 4 2 7 5
4 16 2 8 4 14 10
5 48 6 24 12 42 30
设定:
x = np.random.choice(26, 1000)
y = np.random.choice(26, 1000)
%timeit pd.DataFrame([[a*b for b in x] for a in y]) # Willem Van Onsem's solution
%timeit pd.DataFrame(np.outer(y, x)) # Proposed in this post
结果:
1 loop, best of 3: 566 ms per loop
100 loops, best of 3: 3.75 ms per loop
numpy解决方案比列表理解快150倍。
答案 1 :(得分:2)
您可以使用嵌套列表理解:
pd.DataFrame([[a*b for b in L1] for a in L2])
这会产生:
>>> pd.DataFrame([[a*b for b in L1] for a in L2])
0 1 2 3 4 5
0 40 5 20 10 35 25
1 24 3 12 6 21 15
2 72 9 36 18 63 45
3 8 1 4 2 7 5
4 16 2 8 4 14 10
5 48 6 24 12 42 30
因此外部列表理解[... for a in L2]
迭代L2
并将值分配给变量a
。对于每个这样的变量,我们使用[a*b for b in L1]
生成一个列表(再次使用列表推导),然后我们迭代L1
中的值并生成一个列表,我们将值乘以a
。