Python 对两列数据帧求和,保留非公共行

Python 对两列数据帧求和,保留非公共行,python,pandas,dataframe,Python,Pandas,Dataframe,但是 意识到这不是一个正确的问题 我试图实现的是组合两个数据帧,它们实际上具有相同的列,但可能具有或不具有公共行(多索引的索引)。我想将它们合并,取其中一列的和,但保留其他列 根据公认的答案,方法可能类似于: def mklbl(prefix,n): try: return ["%s%s" % (prefix,i) for i in range(n)] except: return ["%s%s" % (prefix,i) for i in n]

但是 意识到这不是一个正确的问题

我试图实现的是组合两个数据帧,它们实际上具有相同的列,但可能具有或不具有公共行(多索引的索引)。我想将它们合并,取其中一列的和,但保留其他列

根据公认的答案,方法可能类似于:

def mklbl(prefix,n):
    try:
        return ["%s%s" % (prefix,i)  for i in range(n)]
    except:
        return ["%s%s" % (prefix,i) for i in n]



mi1 = pd.MultiIndex.from_product([mklbl('A',4), mklbl('C',2)])

mi2 = pd.MultiIndex.from_product([mklbl('A',[2,3,4]), mklbl('C',2)])

df2 = pd.DataFrame({'a':np.arange(len(mi1)), 'b':np.arange(len(mi1)),'c':np.arange(len(mi1)), 'd':np.arange(len(    mi1))[::-1]}, index=mi1).sort_index().sort_index(axis=1)    

df1 = pd.DataFrame({'a':np.arange(len(mi2)), 'b':np.arange(len(mi2)),'c':np.arange(len(mi2)), 'd':np.arange(len(    mi2))[::-1]}, index=mi2).sort_index().sort_index(axis=1)


df1 = df1.add(df2.pop('b'))
但问题是,这将失败,因为指数不一致

这与我试图实现的目标非常接近,只是我丢失了两个数据帧不共有的行:

df1['b'] = df1['b'].add(df2['b'], fill_value=0)
但这给了我:

Out[197]: 
       a   b  c  d
A2 C0  0   4  0  5
   C1  1   6  1  4
A3 C0  2   8  2  3
   C1  3  10  3  2
A4 C0  4   4  4  1
   C1  5   5  5  0
当我想要的时候:

In [197]: df1
Out[197]: 
       a   b  c  d
A0 C0  0  0  0  7
   C1  1  2  1  6
A1 C0  2  4  2  5
   C1  3  6  3  4
A2 C0  0   4  0  5
   C1  1   6  1  4
A3 C0  2   8  2  3
   C1  3  10  3  2
A4 C0  4   4  4  1
   C1  5   5  5  0

注:针对@RandyC关于XY问题的评论。。。具体的问题是我有一个类,它读取数据并返回1e9行的数据帧。数据框的列为
latll、latur、lonll、lonur、concentration、elevation
。数据帧由
多索引(lat,lon,time)索引,其中time是datetime。两个数据帧的行可能/可能不相同(如果它们在给定日期存在,lat/lon将相同…它们是网格单元中心)
latll、latur、LONL、lonur
根据lat/lon计算得出。我想在添加两个数据帧时对
浓度
列求和,但不更改其他数据帧。

自我回答时,上面的注释中有一个错误,导致重复添加。这是正确的:

newdata = df2.pop('b')
result = df1.combine_first(df2)
result['b']= result['b'].add(newdata, fill_value=0)

似乎为我的用例提供了解决方案。

这闻起来有点像XY问题()。你能提供一些关于你试图解决的首要问题的细节吗?另外,如果你使用随机数据,请使用并提供一个种子。这样我们会得到与您相同的结果/预期。@RandyC是的,我想我最初的问题是,但那里的答案是直接的和有用的,所以我们没有继续。。。我认为用我的实际问题提出一个新问题是有意义的。@AndyHayden抱歉!我忘了在这篇文章中添加mklbl函数。更正。我相信我找到了一个解决方案:
result=df1。首先组合_(df2)
,然后组合,
result['b']=result['b']。添加(df2['b'],fill_value=0)
,但也许有更好的方法?