-2

这是一个示例数据框:

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 中的值。

4

1 回答 1

0

要获取 B 中不在 A 中的那些元素,请使用isin带有~反转(非)运算符的方法:

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

然后你可以concat用 A 附加()这些,排序(如果你使用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我不确定这是否一定是你正确的数据结构......

于 2013-07-13T22:03:45.507 回答