【问题标题】:KeyError: 'One or more row labels was not found' >> lookup python pandasKeyError:'找不到一个或多个行标签'>>查找python pandas
【发布时间】:2021-10-27 03:08:34
【问题描述】:

我的脚本有问题,它生成 KeyError: 'One or more row labels was not found'

df1 = pd.DataFrame({'Destcode' : ['A','B','C','D','E','F','G'],
                     'City A' : ['Available','Available','Available','Available','Not Available','Not Available','Available'],
                     'City B' : ['Not Available','Available','Not Available','Available','Not Available','Not Available','Available'],
                     'City C' : ['Available','Available','Not Available','Available','Not Available','Available','Available']})

df2 = pd.DataFrame({'Destcode' : ['C','F','G','D','E'],
                     'Origin' : ['City A','City C','City A','City B','City D']})

所以,我有 2 个 DataFrame。

数据帧 1

df1
   Destcode       City A         City B         City C
0     A       Available      Not Available   Available
1     B       Available      Available       Available
2     C       Available      Not Available   Not Available
3     D       Available      Available       Available
4     E       Not Available  Not Available   Not Available
5     F       Not Available  Not Available   Available
6     G       Available      Available       Available

数据帧 2

df2
    Destcode    Origin
0      C        City A
1      F        City C
2      G        City A
3      D        City B
4      E        City D

然后我运行这个脚本

df2['Cek Available'] = df1.set_index('Destcode').lookup(df2.Destcode, df2.Origin)

我得到一个错误 enter image description here

我知道问题出在 Origin City D 中,它不在 DataFrame df1 中。

如果您要查找的数据不存在,您如何做到这一点,它将返回值“不可用”? 请帮我解决这个问题

   Destcode   Origin    Cek Available
0      C      City A          ?
1      F      City C          ?
2      G      City A          ?
3      D      City B          ?
4      E      City D          ?

【问题讨论】:

  • 你到底想做什么?请注意,“lookup”在 1.2.0 中已弃用
  • 你能不能帮我写一个能帮我解决的脚本?

标签: python-3.x pandas dataframe lookup lookup-tables


【解决方案1】:

您可以使用try/exceptfor 循环:

cek = []
df1 = df1.set_index('Destcode')
for c, o in zip(df2['Destcode'], df2['Origin']):
    try:
        x = df1.loc[c,o]
    except:
        x = np.nan

    cek.append(x)

df2['Cek Available'] = cek

输出:

  Destcode  Origin Cek Available
0        C  City A     Available
1        F  City C     Available
2        G  City A     Available
3        D  City B     Available
4        E  City D           NaN

【讨论】:

  • 完美,除了:x = 'Not Available' 将返回我想要的值。谢谢
  • 请问? "for c, o"是什么意思 作用是什么?
【解决方案2】:

数据通常在tidy data format 中更容易处理。融化df1 并加入。

df3 = df1.melt(id_vars="Destcode", var_name="Origin")
df2.merge(df3, on=["Destcode", "Origin"], how="left")

结果

  Destcode  Origin      value
0        C  City A  Available
1        F  City C  Available
2        G  City A  Available
3        D  City B  Available
4        E  City D        NaN

【讨论】:

    【解决方案3】:

    我会使用getmelt

    x = df1.melt(id_vars='Destcode', var_name='Origin').set_index(['Destcode', 'Origin']).squeeze()
    df2['Cek Available'] = df2.apply(lambda y: x.get(tuple(y), np.nan), axis=1)
    

    输出:

    >>> df2
      Destcode  Origin Cek Available
    0        C  City A     Available
    1        F  City C     Available
    2        G  City A     Available
    3        D  City B     Available
    4        E  City D           NaN
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2018-12-14
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 2020-07-30
      相关资源
      最近更新 更多