【问题标题】:Matrix of all possible multipliable outcomes from two lists into dataframe从两个列表到数据框的所有可能的可乘结果的矩阵
【发布时间】:2017-07-20 17:24:11
【问题描述】:

我有两个列表,我正在尝试使用pandasdataframe 中创建一个包含所有可能乘法结果的矩阵。

列表:

>>> 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

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    您可以考虑使用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 倍。

    【讨论】:

    • 非常优雅的解决方案! ++
    • 我说谢谢。如果这对您有其他影响,我很抱歉...无论如何,感谢您的帮助。
    • @LearningToPython 很高兴为您提供帮助。祝你好运处理带有列表理解的大型列表;)
    【解决方案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 相乘。

    【讨论】:

    • 你让它看起来如此简单!非常感谢;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多