gpt4 book ai didi

python - 合并两个不同形状的 Pandas 数据框时出现问题?

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:28 24 4
gpt4 key购买 nike

这很简单,但我不明白为什么我不能合并两个数据框。我有以下具有不同形状的 df(一个比另一个更大更宽):

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 列合并 df1df2:

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

最佳答案

您可以尝试将索引设置为 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 所述

关于python - 合并两个不同形状的 Pandas 数据框时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40661313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com