我只想创建一个自己更新的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_连接,但它只是给出了一个错误,我认为有一种更简单/更好的方法。
答案 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