熊猫:根据索引添加行

时间:2017-05-17 12:06:07

标签: python pandas

我只想创建一个自己更新的dataFrame(df3),根据索引(“ID”)添加来自其他dataFrames(df1,df2)的行。

如果找到重叠索引,则添加新的dataFrame时,请更新数据。如果未找到,请添加包含新索引的数据。

df1 = pd.DataFrame({"Proj. Num" :["A"],'ID':[000],'DATA':["NO_DATA"]})
df1 = df1.set_index(["ID"])

df2 = pd.DataFrame({"Proj. Num" :["B"],'ID':[100],'DATA':["OK"], }) 
df2 = df2.set_index(["ID"])

df3 = pd.DataFrame({"Proj. Num" :["B"],'ID':[100],'DATA':["NO_OK"], }) 
df3 = df3.set_index(["ID"])

#df3 = pd.concat([df1,df2, df3]) #Concat,merge,join???
df3

我尝试使用_verify_integrity = False_连接,但它只是给出了一个错误,我认为有一种更简单/更好的方法。

3 个答案:

答案 0 :(得分:3)

使用concat + Index.duplicated进行布尔掩码并按boolean indexing过滤的解决方案:

df3 = pd.concat([df1, df2, df3])
df3 = df3[~df3.index.duplicated()]
print (df3)
        DATA Proj. Num
ID                    
0    NO_DATA         A
100       OK         B

comment的另一种解决方案,谢谢:

df3 = pd.concat([df3,df1]) 
df3 = df3[~df3.index.duplicated(keep='last')]
print (df3)
        DATA Proj. Num
ID                    
100    NO_OK         B
0    NO_DATA         A

答案 1 :(得分:1)

您可以连接索引中的所有数据框; group by索引并决定保留该组的哪个元素共享相同的索引。

从您的问题看,您希望保留具有相同索引的最后一个(最新更新)元素。因此,在pd.concat函数中传递数据帧的顺序非常重要。 有关其他方法的列表,请参阅here

res = pd.concat([df1, df2, df3], axis = 0)
res.groupby(res.index).last()

给出了:

        DATA Proj. Num
ID                    
0    NO_DATA         A
100    NO_OK         B

答案 2 :(得分:0)

#update existing rows 
df3.update(df1)
#append new rows
df3 = pd.concat([df3,df1[~df1.index.isin(df3.index)]])

#update existing rows 
df3.update(df2)
#append new rows
df3 = pd.concat([df3,df2[~df2.index.isin(df3.index)]])

Out[2438]: 
        DATA Proj. Num
ID                    
100       OK         B
0    NO_DATA         A