python与pandas合并(相同索引,同一列)仍返回_x和_y列

时间:2018-10-29 11:29:17

标签: python pandas dataframe merge

我有两个数据框A和B。A和B具有相同的索引和相同的列名。但是,它们的条目是不同的(值和NaN混杂在一起)。

我想将A和B合并到另一个具有相同索引和列的数据框C中。

让我们以A.iloc [1,2]为例,例如A的第一行和第三列。如果A中的该条目为NaN,但B中的该条目为99,我希望C.iloc [1,2]为99。如果它们都是NaN,则结果将为NaN。

如果它们都是两个值,例如23和99,我希望合并产生更大的数字(99),但是我需要将索引标记为错误。

我所做的:

  1. 使用行和列编写for循环,以在两个数据帧之间进行匹配。例如,如果某个条目在A中大于0,在B中大于0,则我将条目的索引存储在列表中,并在C中附加较大的值。这是非常低效的,我想使用更好的方法。 (加上它失败了,因为我是一个可怕的程序员)

  2. 尝试使用pandas.merge。我对合并过程不太了解,但是我尝试了几种类似pd.merge(A, B, left_on = A.index, right_on = B.index, how = 'outer', indicator = True)的方法。它为我返回了一个数据帧,其中包含更多行,并且将其名称末尾附加x和y的列加倍。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

因此,据我了解,您只想针对df1值从df2更新Non-Null

以下面的数据框为例:

In [1761]: df1
Out[1761]: 
   val1  val2  val3
0   NaN   NaN  0.20
1   NaN   0.2   NaN
2   NaN   NaN  0.13
3   NaN  50.0  0.40

In [1762]: df2
Out[1762]: 
   val1   val2  val3
0    99   0.10   NaN
1    99    NaN  0.10
2    99    NaN  0.13
3    99  50.00  0.40

因此,在上述情况下,将发生以下更新:

1。)val1的{​​{1}}将更新df1的列val1的所有行,因为df2对此具有所有非空值列。

2。)df2的{​​{1}}仅更新val2的列df1的第一行,因为val2的值为Non-Null此列的第一行。

3。)df2的{​​{1}}仅更新df2的列val3的第二行,因为df1的值为Non-Null此列的第二行。

注意:val3的列df2的第三行将不会更新,因为即使在df2中它也具有NULL值。

下面是执行上述操作的代码:

val2

现在,df1更新后的外观如下:

df2

我认为这可以解决您的问题。