【问题标题】:Problems while merging two pandas dataframes with different shapes?合并两个不同形状的熊猫数据框时出现问题?
【发布时间】: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 列合并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

【问题讨论】:

  • @JohnE,我也尝试过同样的行为......它重复了几次合并的行。有什么办法可以澄清这个问题吗?。
  • 我刚试过,对我来说效果很好。我怀疑您没有正确读取 df2 的数据(看看您的列如何不对齐?)。仔细检查,如果您键入 df['id'],它是否包含您认为的内容。
  • 如果您尝试在公共索引轴上进行合并,我建议您改用join。试着看看你是否得到了正确的结果。但请确保,两个索引轴都设置得当。
  • 是的,但看起来他正在尝试加入“id”,而不是索引。但是将每个索引设置为“id”,然后使用join 也是解决此问题的好方法。
  • @johndoe,想通了。您在 df1.id 中有重复项。由于您将公司映射到 id,我想映射是唯一的。我已经更新了我的答案。让我知道它是否有效:)

标签: python pandas join merge


【解决方案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') 没有任何问题。如@JohnE 所述,您可能需要仔细检查两个数据框中的id

【讨论】:

  • 是的,实际上内部与外部在这里无关,因为两个数据集的“id”范围从 1 到 5(含)。
  • df1.dtypesdf2.dtypes 的输出是什么?
  • 我发现了问题...检查df1ids 这不是唯一的!...我这样做了:df['id'] = df.index + 1 以强制它们是唯一的。您的解决方案实际上是正确的!问题是在列下方留下一个空白的id 行。我怎样才能删除它?。
  • 如何删除 id 空白行?。
  • 列下方的空白id 行只是一个命名索引,无需担心。如果您想摆脱它,只需在最后执行 df3 = df3.reset_index() :) 另外 - 我会推荐 df1.drop_duplicates() 而不是 df1['id'] = df1.index + 1 - 假设 df1 和 df2 使用 id 作为连接键。算术改变连接键是不安全的,你可能会得到不正确的结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2016-01-01
  • 2019-05-26
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多