2016-11-17 67 views
4

這很簡單,但我不明白爲什麼我不能合併兩個數據框。我有以下df s的不同的形狀(其中一個是比另一個更大更寬):合併兩個不同形狀的大熊貓數據框時的問題?

DF1

A      id 
0 microsoft inc   1 
1 apple computer.  2 
2 Google Inc.   3 
3 IBM     4 
4 amazon, Inc.   5 

DF2

B C D E id 
0 (01780-500-01) 237489 - 342 API  True. 1 
0 (409-6043-01) 234324 API  Other 2 
0 23423423 API  NaN  NaN  3 
0 (001722-5e240-60) NaN  NaN  Other 4 
1 (0012172-52411-60) 32423423. NaN  Other 4 
0 29849032-29482390 API  Yes  False 5 
1 329482030-23490-1 API  Yes  False 5 

我想通過合併df1df2index專欄:

df3

A B C D E id 
0 microsoft inc (01780-500-01) 237489 - 342 API  True. 1 
1 apple computer. (409-6043-01) 234324 API  Other 2 
2 Google Inc. 23423423 API  NaN  NaN  3 
3 IBM (001722-5e240-60) NaN  NaN  Other 4 
4 IBM (0012172-52411-60) 32423423. NaN  Other 4 
5 amazon, Inc. 29849032-29482390 API  Yes  False 5 
6 amazon, Inc. 329482030-23490-1 API  Yes  False 5 

我知道這可以通過使用merge()來完成。另外,我看了這個優秀的tutorial並試圖:

在:

pd.merge(df1, df2, on=df1.id, how='outer') 

日期:

IndexError: indices are out-of-bounds 

然後我嘗試:

pd.merge(df2, df1, on='id', how='outer') 

而且很顯然,它的重複幾次合併的行,如下所示:

A B C D E index 
0 microsoft inc (01780-500-01) 237489 - 342 API  True. 1 
1 apple computer. (409-6043-01) 234324 API  Other 2 
2 apple computer. (409-6043-01) 234324 API  Other 2 
3 apple computer. (409-6043-01) 234324 API  Other 2 
4 apple computer. (409-6043-01) 234324 API  Other 2 
5 apple computer. (409-6043-01) 234324 API  Other 2 
6 apple computer. (409-6043-01) 234324 API  Other 2 
7 apple computer. (409-6043-01) 234324 API  Other 2 
8 apple computer. (409-6043-01) 234324 API  Other 2 
... 

我認爲這與我創建時間索引df2['position'] = df2.index這一事實有關,因爲索引看起來很奇怪,然後將其刪除。所以,我的問題是如何獲得df3

UPDATE

我固定的df2這樣的指標:

df2.reset_index(drop=True, inplace=True) 

,現在看起來是這樣的:

B C D E id 
0 (01780-500-01) 237489 - 342 API  True. 1 
1 (409-6043-01) 234324 API  Other 2 
2 23423423 API  NaN  NaN  3 
3 (001722-5e240-60) NaN  NaN  Other 4 
4 (0012172-52411-60) 32423423. NaN  Other 4 
5 29849032-29482390 API  Yes  False 5 
6 329482030-23490-1 API  Yes  False 5 

我仍然有同樣的問題。合併的行重複多次。

>>>print(df2.dtypes) 
B object 
C object 
D object 
E object 
id int64 
dtype: object 

>>>print(df1.dtypes) 
A    object 
id    int64 
dtype: object 

UPDATE2

>>>print(df2['id']) 
0  1 
1  2 
2  3 
3  4 
4  4 
5  5 
6  5 
7  6 
8  6 
9  7 
10  8 
11  8 
12  8 
13  8 
14  9 
15  10 
16  11 
17  11 
18  12 
19  12 
20  13 
21  13 
22  14 
23  15 
24  16 
25  16 
26  17 
27  17 
28  18 
29  18 
     ... 
476 132 
477 132 
478 132 
479 132 
480 132 
481 132 
482 132 
483 132 
484 133 
485 133 
486 133 
487 133 
488 134 
489 134 
490 134 
491 134 
492 135 
493 135 
494 136 
495 136 
496 137 
497 137 
498 137 
499 137 
500 137 
501 137 
502 137 
503 138 
504 138 
505 138 
Name: id, dtype: int64 

而且

>>>print(df1) 

0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 
7  8 
8  9 
9  10 
10  11 
11  8 
12  12 
13  6 
14  7 
15  8 
16  6 
17  11 
18  13 
19  14 
20  15 
21  11 
22  2 
23  16 
24  17 
25  18 
26  9 
27  19 
28  11 
29  20 
     .. 
108 57 
109 43 
110 22 
111  2 
112 58 
113 49 
114 22 
115 59 
116  2 
117  6 
118 22 
119  2 
120 37 
121  2 
122  9 
123 60 
124 61 
125 62 
126 63 
127 42 
128 64 
129  4 
130 29 
131 11 
132  2 
133 25 
134  4 
135 65 
136 66 
137  4 
Name: id, dtype: int64 
+0

@JohnE所述,我也嘗試了這種行爲......它重複了幾次合併行。有什麼辦法可以澄清這個問題嗎? –

+0

我剛剛嘗試過,它對我來說工作正常。我懷疑你沒有正確地讀取df2數據(請參閱你的列不排隊?)。仔細檢查一下,如果你輸入'df ['id']'它包含你認爲它所做的事情。 – JohnE

+0

如果您嘗試在公共索引軸上合併,我建議使用['join'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html) 。試着看看你是否得到了正確的結果。但請確保,索引軸都適當設置。 –

回答

1

你可以嘗試設置索引id,然後用join

df1 = pd.DataFrame([('microsoft inc',1), 
('apple computer.',2), 
('Google Inc.',3), 
('IBM',4), 
('amazon, Inc.',5)],columns = ('A','id')) 

df2 = pd.DataFrame([('(01780-500-01)','237489', '- 342','API', 1), 
('(409-6043-01)','234324', ' API','Other ',2), 
('23423423','API', 'NaN','NaN',  3), 
('(001722-5e240-60)','NaN', 'NaN','Other', 4), 
('(0012172-52411-60)','32423423',' NaN','Other', 4), 
('29849032-29482390','API', ' Yes','  False', 5), 
('329482030-23490-1','API', ' Yes','  False', 5)], 
columns = ['B','C','D','E','id']) 

df1 =df1.set_index('id') 
df1.drop_duplicates(inplace=True) 
df2 = df2.set_index('id') 
df3 = df1.join(df2,how='outer') 

由於您已經爲兩個數據框設置了索引列(又名連接鍵),所以您不必指定on='id'參數。

這是解決問題的替代方法..我沒有看到pd.merge(df1, df2, on='id', how='outer')有什麼問題。您可能需要再次檢查兩個數據幀中的id列,如@JohnE

+1

是的,實際上內部與外部是無關緊要的,因爲'id'的範圍從1到5(包括兩個數據集)。 – JohnE

+1

'df1.dtypes'和'df2.dtypes'的輸出是什麼? –

+0

我更新了@ShivamGaur –