Python 使用基于索引的其他数据帧替换数据帧中的行
我有两个数据帧Python 使用基于索引的其他数据帧替换数据帧中的行,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧 df1 B C A 0 300 6 1 400 7 2 500 8 3 600 9 df2 B C A 2 433 99 3 555 99 这就是我构建它们的方式: df1 = pd.DataFrame({'A': [0, 1, 2, 3], 'B': [300, 400, 500, 600], 'C': [6, 7, 8,
df1
B C
A
0 300 6
1 400 7
2 500 8
3 600 9
df2
B C
A
2 433 99
3 555 99
这就是我构建它们的方式:
df1 = pd.DataFrame({'A': [0, 1, 2, 3],
'B': [300, 400, 500, 600],
'C': [6, 7, 8, 9]})
df1.set_index('A', inplace=True)
df2 = pd.DataFrame({'A': [2, 3],
'B': [433, 555],
'C': [99, 99]})
df2.set_index('A', inplace=True)
我想根据索引将df1
中的所有行替换为df2
中的行,结果如下所示:
df_result
B C
A
0 300 6
1 400 7
2 433 99
3 555 99
做这件事最优雅的方法是什么?首先尝试
组合:
df2.combine_first(df1)
输出:
B C
A
0 300.0 6.0
1 400.0 7.0
2 433.0 99.0
3 555.0 99.0
这是为了:
df1.update(df2)
>>> df1
B C
A
0 300.0 6.0
1 400.0 7.0
2 433.0 99.0
3 555.0 99.0
注意:使用.loc
不会更改列的类型
df1.loc[df2.index,:]=df2
df1
Out[20]:
B C
A
0 300 6
1 400 7
2 433 99
3 555 99
对我来说,这是行不通的:我得到的df1没有改变,因此你需要将这个方法的输出重新分配给一个新的数据帧。或者将其分配回df1。这不是像“更新”这样的就地方法。请尝试df\u out=df2。首先合并(df1)
print(df\u out)
。当前的pandas文档说明:“通过将一个数据帧中的空值填充到另一个数据帧中的非空值来合并两个数据帧对象。”因此,这不再给出原始问题中的行为-非空值不会被覆盖。@Juho这似乎仍然适用于此示例。而且,我不确定该文档在过去是否有任何不同。你能举个例子说明这不起作用吗?@ScottBoston我错了。我把df1和df2弄糊涂了。我只是觉得逻辑有点混乱,因为在我的特定用例中,df1实际上是“主”数据表,df2是我们想要对其进行的更改(替换单独的行并添加新的行),然而语法df2.combine_first(df1)似乎暗示了相反的情况。但是,是的,考虑到所有未更改的行在df2中都是空值并被df1替换,它确实做到了这一点。唯一的限制是只实现左连接,保留原始对象的索引和列。这意味着,如果df2在df1中没有找到索引,则这些索引不会添加到df1中。根据可能出现问题的用例,在这种情况下,df1.combined_first(df2)
效果更好。需要更正我自己的注释。Combine_firstdf1。Combine_first(df2)
工作得更好,只要用df2中的值替换df1中的非空值就足够了。为了使用两个索引的并集更新非空值,需要另一种解决方案。