2013-07-13 58 views
-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,同时保持顺序,索引和重复所述的完好。与此同时,我只是想从B中不是在这样所产生的数据框的值应该是这样的:

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的concat,但是由于重复被丢弃,所以不保留列A的值。

我想保留什么是已经存在,但还添加B中不是A.值

+0

请澄清,比方说,一个有值[1,1,2,4,5]和B的值为[1,2,3,4,5]。由于A有1,2,4和5,B值1,2,4和5不会被添加。但为了保留秩序,可以添加3来维护顺序或维持其在索引中的位置。即合并列表看起来像这样A = [1,1,2,3,4,5] B = [1,2,3,4,5,NaN]或者像这样A = [1,1,2, 4,5,3] B = [1,2,3,4,5,NaN]? – franklin

+0

感谢您的回复。后者很好,即A = [1,1,2,4,5,3] B = [1,2,3,4,5,NaN]很好。 – Sutram

回答

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 

,然后创建一个新的数据框:

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我不知道这是否是一定是你正确的数据结构...

+0

这正是我需要的!非常感激。对我来说缺少的部分是isin和reset_index。熊猫是一个很棒的数据操作库。 – Sutram

相关问题