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)
,但也许有更好的方法?