【发布时间】:2017-04-01 08:58:24
【问题描述】:
这很简单,但我不明白为什么我不能合并两个数据框。我有以下不同形状的dfs(一个比另一个更大更宽):
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
我想通过index 列合并df1 和df2:
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?
更新
我这样修复了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
更新2
>>>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
【问题讨论】:
-
@JohnE,我也尝试过同样的行为......它重复了几次合并的行。有什么办法可以澄清这个问题吗?。
-
我刚试过,对我来说效果很好。我怀疑您没有正确读取 df2 的数据(看看您的列如何不对齐?)。仔细检查,如果您键入
df['id'],它是否包含您认为的内容。 -
如果您尝试在公共索引轴上进行合并,我建议您改用
join。试着看看你是否得到了正确的结果。但请确保,两个索引轴都设置得当。 -
是的,但看起来他正在尝试加入“id”,而不是索引。但是将每个索引设置为“id”,然后使用
join也是解决此问题的好方法。 -
@johndoe,想通了。您在
df1.id中有重复项。由于您将公司映射到 id,我想映射是唯一的。我已经更新了我的答案。让我知道它是否有效:)