【问题标题】:Key error when performing pd.merge on string columns对字符串列执行 pd.merge 时出现键错误
【发布时间】:2020-01-10 21:24:01
【问题描述】:

我在对两个数据帧执行合并时遇到问题。

我的数据如下,一个包含121个不同指示物种的14万条出现记录的数据集,例如:

taxon
spp1
spp1
spp118
spp98
spp64
spp119

另一个包含 121 个物种的列表,带有数字分数,例如:

taxon  score
spp1   8
spp2   4
spp3   2
spp4   7
...
spp118 4
spp119 2
spp120 1
spp121 8

我希望使用分类列作为连接字段将分数列连接到数据集以进行后续分析,我设想这样的输出:

taxon  score
spp1   8
spp1   8
spp118 4
spp98  6
spp64  2
spp119 2

到目前为止,我已经尝试了以下方法:

data_in1 = pd.read_csv(r'occourence_list.csv', encoding='utf-8')
df1 = pd.DataFrame(data_in1)
df1['taxon'] = df1['taxon'].astype(str)
print(df1.head())
print(df1.dtypes)

data_in2 = pd.read_csv(r'score_list.csv', encoding='utf-8')
df2 = pd.DataFrame(data_in2)
df2['taxon'] = df2['taxon'].astype(str)
print(df2.head())
print(df2.dtypes)

result = pd.merge(df1,
                  df2[['iapa_score']],
                  left_on=['taxon'],
                  right_on=['taxon'],
                  how='outer')

print(result.head())

但是,这会返回以下错误:

Traceback (most recent call last):
  File "C:/Users/", line 19, in <module>
    how='outer')
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\pandas\core\reshape\merge.py", line 47, in merge
    validate=validate)
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\pandas\core\reshape\merge.py", line 529, in __init__
    self.join_names) = self._get_merge_keys()
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\pandas\core\reshape\merge.py", line 833, in _get_merge_keys
    right._get_label_or_level_values(rk))
  File "C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3\lib\site-packages\pandas\core\generic.py", line 1706, in _get_label_or_level_values
    raise KeyError(key)
KeyError: 'taxon'

【问题讨论】:

    标签: python pandas join


    【解决方案1】:

    在我看来,问题来自df2[['iapa_score']] 这一行,因为如果您将数据框限制为“iapa_score”列,则“分类单元”列不再出现,因此出现“KeyError”。您还应该在合并中使用参数how='left',因为您只想保留来自 df1 的行。

    我自己创建了 2 个数据框来重现您的情况,请看一下:

    df1 = pd.DataFrame({'taxon': ["spp1", "spp1", "spp3"]})
    df2 = pd.DataFrame({'taxon': ["spp1", "spp2", "spp3", "spp4"], 'score': ["8", "7", "6", "17"]})
    result = pd.merge(df1,
                      df2,
                      left_on=['taxon'],
                      right_on=['taxon'],
                      how='left')
    print(result)
    

    df1:

      taxon
    0  spp1
    1  spp1
    2  spp3
    

    df2:

      taxon score
    0  spp1     8
    1  spp2     7
    2  spp3     6
    3  spp4    17
    

    结果:

      taxon score
    0  spp1     8
    1  spp1     8
    2  spp3     6
    

    【讨论】:

    • 感谢您的解释,我偶然发现了导致关键错误的原因,这使其更加清晰,并指出了从外连接到左连接的变化。
    【解决方案2】:

    我偶然发现了一个解决方案,我改变了:

    result = pd.merge(df1,
                      df2[['iapa_score']],
                      left_on=['taxon'],
                      right_on=['taxon'],
                      how='outer')
    

    result = pd.merge(df1,
                      df2,
                      left_on=['taxon'],
                      right_on=['taxon'],
                      how='outer')
    

    它奏效了。我的印象是,在第二个数据框之后的 [] 中的列名暗示了您希望加入的那些列。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多