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
列求和,但不要更改其他数据框。
答案 0 :(得分:0)
自我回答,上面的评论中有一个错误导致了双重添加。这是正确的:
newdata = df2.pop('b')
result = df1.combine_first(df2)
result['b']= result['b'].add(newdata, fill_value=0)
似乎为我的用例提供了解决方案。