【问题标题】:pandas dataframe how to do "elementwise" concatenation?熊猫数据框如何进行“逐元素”连接?
【发布时间】:2021-02-02 00:53:16
【问题描述】:

我有两个具有相同形状、索引和列的熊猫数据框A,BA 的每个元素都是一个np.ndarray,形状为(n,1)B 的每个元素都是一个浮点值。现在我想有效地B elementwise 附加到A。一个最小的例子:

index = ['fst', 'scd']

column = ['a','b']

A
Out[23]: 
          a       b
fst  [1, 2]  [1, 4]
scd  [3, 4]  [3, 2]

B
Out[24]: 
            a         b
fst  0.392414  0.641136
scd  0.264117  1.644251

resulting_df = pd.DataFrame([[np.append(A.loc[i,j], B.loc[i,j]) for i in index] for j in column], columns=column, index=index)

resulting_df
Out[27]: 
                              a                           b
fst  [1.0, 2.0, 0.392414377685]  [3.0, 4.0, 0.264117463613]
scd  [1.0, 4.0, 0.641136433253]   [3.0, 2.0, 1.64425062851]

是否有类似于pd.DataFrame.applymap 的东西可以在两个而不是一个熊猫数据帧之间按元素操作?

【问题讨论】:

  • 输入和预期输出(如果可能)
  • @Bharathshetty 添加。谢谢。
  • 很好奇,这样存储数据有什么用? DataFrames 最适合 mxn 标量,否则您也有 Panel 选项
  • @Zero 用于财务分析目的:索引是日期,列是股票池,我需要将 AB 中的数据作为解释变量进行横截面回归。
  • 我认为你的输出是错误的。 ascd 应该是 [3.0, 4.0, 0.264117463613] na

标签: python pandas dataframe


【解决方案1】:

您可以使用 applymap 将 df2 中的元素转换为列表,然后只需普通添加即可组合列表,即

index = ['fst', 'scd']

column = ['a','b']


A = pd.DataFrame([[[1, 2],[1, 4]],[[3, 4],[3, 2]]],index,column)
B = pd.DataFrame([[0.392414,0.264117],[ 0.641136 , 1.644251]],index,column)

选项 1

n =  B.applymap(lambda y: [y])
ndf = A.apply(lambda x : x+n[x.name])

选项 2: 使用pd.concat 了解其工作原理检查here

pd.concat([A,B]).groupby(level=0).apply(lambda g: pd.Series({i: np.hstack(g[i].values) for i in A.columns}))

为了让你当前的方法给出正确的输出转移循环,即

pd.DataFrame([[np.append(A.loc[i,j], B.loc[i,j]) for j in A.columns] for i in A.index], columns=A.columns, index=A.index)

输出:

一个 fst [1.0, 2.0, 0.392414] [1.0, 4.0, 0.264117] scd [3.0, 4.0, 0.641136] [3.0, 2.0, 1.644251]

【讨论】:

  • 感谢您的回答。不过,我不确定它是否比两个 for 循环更有效。
  • 很抱歉,我一开始没有尝试您的解决方案,很快就会想出办法
  • 不用担心。也许这种复杂性无法减轻。我发布这个问题主要是为了搜索现有的轮子,希望这些轮子可能比我们自己实现的更有效。
【解决方案2】:

你可以这样做:

>>> A + B.applymap(lambda x : [x])
                    a                 b
fst  [1, 2, 0.392414]  [1, 4, 0.264117]
scd  [3, 4, 0.641136]  [3, 2, 1.644251]

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2019-12-02
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2016-03-09
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多