2013-07-13 115 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

相關問題