将两个pandas数据帧列相加,保留非公共行

时间:2015-11-18 05:23:22

标签: python pandas dataframe

I just asked a similar question然后  意识到,这不是正确的问题。

我想要完成的是组合两个实际上具有相同列的数据帧,但可能有也可能没有公共行(MultiIndex的索引)。我想把它们中的一列加在一起,但是留下其他列。

根据接受的答案,方法可能类似于:

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。数据框由MultiIndex(纬度,经度,时间)索引,其中时间是日期时间。两个数据帧的行可能/可能不相同(如果它们在给定日期存在,则lat / lon将是相同的......它们是网格单元中心)。 latll, latur, lonll, lonur是从lat / lon计算的。我想在添加两个数据框时对concentration列求和,但不要更改其他数据框。

1 个答案:

答案 0 :(得分:0)

自我回答,上面的评论中有一个错误导致了双重添加。这是正确的:

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

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