Python 熊猫:根据索引添加行

Python 熊猫:根据索引添加行,python,pandas,Python,Pandas,我只想创建一个用自身更新的数据帧(df3),根据索引(“ID”)添加来自其他数据帧(df1,df2)的行 如果发现重叠索引,则添加新数据帧时,更新数据。如果未找到,请添加包含新索引的数据 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'

我只想创建一个用自身更新的数据帧(df3),根据索引(“ID”)添加来自其他数据帧(df1,df2)的行

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

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_uu连接,但它只会给出一个错误,我认为有一种更简单/更好的方法来实现此操作。

解决方案+用于布尔掩码和过滤方式:

另一个解决方案是,谢谢:

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

您可以沿着索引连接所有数据帧;索引并决定要保留共享同一索引的组的哪个元素

从您的问题来看,您似乎希望使用相同的索引保留最后一个(最新的)元素。然后,在
pd.concat
函数中传递数据帧的顺序很重要。 有关其他方法的列表,请参阅

其中:

        DATA Proj. Num
ID                    
0    NO_DATA         A
100    NO_OK         B

您能否详细说明您提到的错误?第一种解决方案不起作用,因为我需要获得df3的先前状态,然后根据索引是否已经在df3上,追加|更新df3和df4数据帧。第二种解决方案确实有效,但更改“保持第一”。如果你的答案正确,这是一个很好的解决方案。对不起,现在的解决方案是正确的
keep='first'
默认为,因此可以省略。谢谢。实际上,您可以发布这两种解决方案,如果保留现有的解决方案,则值将追加到第一行。相反,如果使用df3=pd.concat([df3,df1])和df3=df3[~df3.index.duplicated(keep='last')],它将起作用,值将被追加到末尾*我放弃了df2,认为是多余的。谢谢你接受。您也可以向上投票-单击接受标记上方的
2
小三角形。谢谢
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
#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