【问题标题】:Pandas: each cell is a list, how to perform element-wise subtraction between cells?Pandas:每个单元格都是一个列表,如何在单元格之间执行逐元素减法?
【发布时间】:2021-08-31 09:34:39
【问题描述】:

我有两个数据框:

df1 =   l1      l2       l3
     [4,2,1]  [8,9,6]  [7,4,5]
df2 =   l1      l2       l3
     [2,1,0]  [7,7,2]  [6,1,2]

我希望,对于每个单元格,在 df1df2 之间执行元素减法(对于每个单元格和每个元素,df1 - df2)。

所以 new_df 将是:

new_df =  l1       l2       l3
        [2,1,1]  [1,2,,4] [1,3,4]

最有效的方法是什么?

谢谢

【问题讨论】:

  • 总是有 3 个值?
  • 最后一个值应该是 3,而不是 4。(5-2)
  • @jezrael 并不总是 3,但在两个 dfs 中总是相同的长度

标签: python pandas apply data-munging


【解决方案1】:

我不确定您是如何得出这个相当笨重的数据结构的,但这里有一个笨拙的解决方案:

>>> df1.applymap(np.array) - df2
          l1         l2         l3
0  [2, 1, 1]  [1, 2, 4]  [1, 3, 3]

【讨论】:

  • 我不觉得它笨重,这可能是最合理的做法;)
【解决方案2】:

如果 DataFrame 中每列的值始终相同,请使用:

df1 = pd.DataFrame({'l1':[[4,2,1],[4,2,1]],'l2':[[8,9,6],[8,9,6]],'l3':[[7,4,5], [7,4,5]]})
df2 = pd.DataFrame({'l1':[[2,1,0],[2,1,0]],'l2':[[7,7,2], [2,1,0]],'l3':[[6,1,2], [2,1,0]]})

a = np.array(df1.to_numpy().tolist()) - np.array(df2.to_numpy().tolist())
df = pd.DataFrame(a.tolist(), index=df1.index, columns=df2.columns)
print (df)
          l1         l2         l3
0  [2, 1, 1]  [1, 2, 4]  [1, 3, 3]
1  [2, 1, 1]  [6, 8, 6]  [5, 3, 5]

【讨论】:

    【解决方案3】:

    如果您想要一个非常简单易懂的解决方案,您可以使用 for 循环

    df1 = pd.DataFrame([[[4,2,1],[8,9,6],[7,4,5]]])
    df2 = pd.DataFrame([[[2,1,0],[7,7,2],[6,1,2]]])
    
    result = []
    for lst1, lst2 in zip(df1.values[0], df2.values[0]):
        result.append([i - j for i,j in zip(lst1, lst2)])
    
    result = pd.DataFrame([result])
    ``
    

    【讨论】:

    • IMO 这既不是更容易理解也不是更简单(而且效率肯定更低)
    • 我们将列表存储在 pandas 数据框中。我们离高效的土地还有很长的路要走:D
    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2016-05-09
    • 2023-02-11
    • 2022-10-06
    • 2016-09-15
    • 2015-10-06
    相关资源
    最近更新 更多