【问题标题】:Combine/Splice pandas DataFrames with a condition结合/拼接 pandas DataFrames 与条件
【发布时间】:2017-05-27 02:21:43
【问题描述】:

我有两个 pandas 数据框,AB
数据框具有相同的索引和列,只是不同的数据。 我有一个额外的数组 X,它是索引的子集。

我想要实现的目标: 生成的矩阵 C 也具有与 AB 相同的索引和列。对于其数据,如果索引在 X 中,则从数据帧 A 获取行条目,否则从 B 获取行条目。

我认为会有一种 Python 的方式来实现这一点,但它们无法编译。例如,我使用 A 的索引创建了一个 C 数据框,然后尝试了以下操作:

C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index])

我现在有一些工作,我基本上用数学方法解决它。因此,我创建了两个基于 X 的布尔数组,以分别指定我想要的 AB 中的哪些条目。然后我将 AB 乘以这些矩阵,然后执行 C = A + B强>。实现解决方案似乎很冗长。我追求的是更短、更易读的东西。我目前的解决方案如下:

def testIn(row):
    return [x in X for x in row.index]
def testOut(row):
    return [x not in X for x in row.index]

AMAP = C.apply(testIn, axis=0)
BMAP = C.apply(testOut, axis=0)

ANEW = pandas.DataFrame(AMAP*A)
BNEW = pandas.DataFrame(BMAP*B)

C = ANEW + BNEW

【问题讨论】:

    标签: python pandas dataframe merge conditional


    【解决方案1】:

    考虑以下数据

    B = pd.DataFrame(np.zeros((6, 6)), list('ABCDEF'), list('abcdef'))
    A = pd.DataFrame(np.ones((6, 6)), B.index, B.columns)
    x = ['A', 'D']
    

    pd.DataFrame.combine_first 从第一个数据帧中获取值并补充第二个数据帧。但是在列表x 上使用loc,我将A 限制为我想要的行,并结合B 的其余部分。

    C = A.loc[x].combine_first(B)
    
    print(C)
    
         a    b    c    d    e    f
    A  1.0  1.0  1.0  1.0  1.0  1.0
    B  0.0  0.0  0.0  0.0  0.0  0.0
    C  0.0  0.0  0.0  0.0  0.0  0.0
    D  1.0  1.0  1.0  1.0  1.0  1.0
    E  0.0  0.0  0.0  0.0  0.0  0.0
    F  0.0  0.0  0.0  0.0  0.0  0.0
    

    其他选择

    A.query('index in @x').combine_first(B)
    

    B.drop(x).append(A.loc[x]).reindex_like(A)
    

    【讨论】:

      【解决方案2】:

      做这样的事情:

      C = A.copy()
      C.update(B.iloc[X])
      

      您基本上复制了一个数据帧,然后根据匹配的索引过滤另一个数据帧的记录。

      如果您想将 A 的完整副本保留到 C 中,您可以针对 X 对 A 和 B 进行分区:

      C = A[~A.index.isin(X)]
      C = C.append(B.iloc[X]).reindex(A.index)
      

      【讨论】:

      • 当然更新!谢谢你。我在其他地方使用它,但在这里忽略了它作为解决方案。
      猜你喜欢
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 2019-08-06
      • 2022-01-09
      • 2013-08-03
      • 2023-03-22
      • 2021-02-22
      • 2018-05-16
      相关资源
      最近更新 更多