合并DataFrame中的两列,同时保留第一列值

时间:2013-07-13 19:14:00

标签: python pandas

以下是DataFrame示例:

In [308]: df
Out[308]: 
   A  B
0  1  1
1  1  2
2  2  3
3  2  4
4  3  5
5  3  6

我希望合并A和B,同时保持A中的顺序,索引和重复。同时,我只想从B中获取不在A中的值,因此生成的DataFrame应如下所示:

In [308]: df
Out[308]: 
   A  B
0  1  1
1  1  2
2  2  3
3  2  4
4  3  5
5  3  6
6  4  NaN
7  5  NaN
8  6  NaN

任何指针都会非常感激。我尝试对两列和一个groupby进行连接,但是不保留列A值,因为重复项被丢弃。

我想保留已经存在的内容,但也要添加B中不在A中的值。

1 个答案:

答案 0 :(得分:0)

要使B中的那些元素不在A中,请将isin方法与~ invert(非)运算符一起使用:

In [11]: B_notin_A = df['B'][~df['B'].isin(df['A'])]

In [12]: B_notin_A
Out[12]:
3    4
4    5
5    6
Name: B, dtype: int64

然后您可以使用A附加(concat)这些,排序(如果您使用order它返回结果而不是执行操作)和reset_index

In [13]: A_concat_B_notin_A = pd.concat([df['A'], B_notin_A]).order().reset_index(drop=True)

In [14]: A_concat_B_notin_A
Out[14]:
0    1
1    1
2    2
3    2
4    3
5    3
6    4
7    5
8    6
dtype: int64

然后创建一个新的DataFrame:

In [15]: pd.DataFrame({'A': A_concat_B_notin_A, 'B': df['B']})
Out[15]:
   A   B
0  1   1
1  1   2
2  2   3
3  2   4
4  3   5
5  3   6
6  4 NaN
7  5 NaN
8  6 NaN

FWIW我不确定这对您来说是否一定是正确的数据结构......