2017-02-24 73 views
-1

我是熊貓新手,我想合併兩個具有相似列的數據集。除了許多相同的值之外,列將與其他列相比具有一些唯一值。每列中都有一些我想保留的重複項。我所需的輸出如下所示。添加='內部'或'外部'不會產生所需的結果。熊貓合併創建不需要的重複條目

import pandas as pd 

dict1 = {'A':[2,2,3,4,5]} 
dict2 = {'A':[2,2,3,4,5]} 

df1 = pd.DataFrame(dict1) 
df2 = pd.DataFrame(dict2) 

print(pd.merge(df1,df2)) 

output: 
    A 
0 2 
1 2 
2 2 
3 2 
4 3 
5 4 
6 5 

desired/expected output: 
    A 
0 2 
1 2 
2 3 
3 4 
4 5 

請讓我知道如果我可以使用合併來實現所需的輸出,謝謝!

編輯 對此有很多評論。爲了說明爲什麼我對這種行爲感到困惑,如果我簡單地添加另一列,它不會生成四個2,而只有兩個2,所以我期望在我的第一個示例中它也會有兩個2。爲什麼行爲似乎會改變,大熊貓在做什麼?

import pandas as pd 
dict1 = {'A':[2,2,3,4,5], 
     'B':['red','orange','yellow','green','blue'], 
     } 
dict2 = {'A':[2,2,3,4,5], 
     'B':['red','orange','yellow','green','blue'], 
     } 

df1 = pd.DataFrame(dict1) 
df2 = pd.DataFrame(dict2) 

print(pd.merge(df1,df2)) 

output: 
    A  B 
0 2  red 
1 2 orange 
2 3 yellow 
3 4 green 
4 5 blue 

However, based on the first example I would expect: 
    A  B 
0 2  red 
1 2 orange 
2 2  red 
3 2 orange 
4 3 yellow 
5 4 green 
6 5 blue 
+1

請您加入更明確一些例子,說了一些不同的數據點? – miradulo

+1

我以前遇到過確切的問題。當您嘗試合併的列中有重複項時,會發生這種情況 – AsheKetchum

+0

我提供的答案將幫助您用臨時索引解決它。你會得到所需的輸出,但它不一定是最有效的方法。 – AsheKetchum

回答

1
import pandas as pd 

dict1 = {'A':[2,2,3,4,5]} 
dict2 = {'A':[2,2,3,4,5]} 

df1 = pd.DataFrame(dict1).reset_index() 
df2 = pd.DataFrame(dict2).reset_index() 

df = df1.merge(df2, on = 'A') 
df = pd.DataFrame(df[df.index_x==df.index_y]['A'], columns=['A']).reset_index(drop=True) 

print(df) 

輸出:

A 
0 2 
1 2 
2 3 
3 4 
4 5 
0

did you try df.drop_duplicates()?

import pandas as pd 

dict1 = {'A':[2,2,3,4,5]} 
dict2 = {'A':[2,2,3,4,5]} 

df1 = pd.DataFrame(dict1) 
df2 = pd.DataFrame(dict2) 

df=pd.merge(df1,df2) 
df_new=df.drop_duplicates() 
print df 
print df_new 

看來,它給你想要

+1

我知道你還沒有代表評論,但這不是一個答案。 – miradulo

+1

憐憫這個傢伙 – AsheKetchum

+1

@AsheKetchum「憐憫」upvoting可能不健康。這不是一個答案。 – miradulo

0
dict1 = {'A':[2,2,3,4,5]} 
dict2 = {'A':[2,2,3,4,5]} 

df1 = pd.DataFrame(dict1) 
df1['index'] = [i for i in range(len(df1))] 
df2 = pd.DataFrame(dict2) 
df2['index'] = [i for i in range(len(df2))] 

df1.merge(df2).drop('index', 1, inplace = True) 

的想法是合併基礎上,匹配指數以及與之相配套的「A」列值的結果。
以前,由於合併工作的方式取決於匹配,所發生的是df1中的前2個與df2中的第一個和第二個2匹配,並且df1中的第二個2與第一個和第二個2匹配df2也是如此。

如果你試試這個,你會看到我在說什麼。

dict1 = {'A':[2,2,3,4,5]} 
dict2 = {'A':[2,2,3,4,5]} 

df1 = pd.DataFrame(dict1) 
df1['index'] = [i for i in range(len(df1))] 
df2 = pd.DataFrame(dict2) 
df2['index'] = [i for i in range(len(df2))] 

df1.merge(df2, on = 'A')