【问题标题】:Passing list-likes to .loc or [] with any missing labels is no longer supported不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []
【发布时间】:2021-07-21 02:02:23
【问题描述】:

我想用指定的列创建一个修改过的数据框。 我尝试了以下方法,但抛出错误“不再支持将列表喜欢传递给 .loc 或 [] 并带有任何缺失的标签”

# columns to keep
filtered_columns = ['text', 'agreeCount', 'disagreeCount', 'id', 'user.firstName', 'user.lastName', 'user.gender', 'user.id']
tips_filtered = tips_df.loc[:, filtered_columns]

# display tips
tips_filtered

谢谢

【问题讨论】:

  • 检查df.columns 中的拼写错误或前导/尾随空格,如有必要,您可以将str.strip() 关闭。实际数据框中不存在某些/任何列

标签: python pandas numpy dataframe


【解决方案1】:

看起来 Pandas 已经弃用了这种索引方法。根据他们的docs

此行为已弃用,将显示警告消息指向 到本节。推荐的替代方法是使用 .reindex()

使用新的recommended method,您可以使用以下方法过滤列:

tips_filtered = tips_df.reindex(columns = filtered_columns).

注意:要重新索引行,您可以使用reindex(index = ...)(更多信息here)。

【讨论】:

    【解决方案2】:

    列表中的某些列不包含在数据框中,如果您确实想这样做,让我们试试reindex

    tips_filtered = tips_df.reindex(columns=filtered_columns)
    

    【讨论】:

    • 成功了。所有列都在数据框中。不过,为什么会抛出这个错误?
    • @swasthiknayak 让我们做,set(filtered_columns).difference(set(df.columns.tolist())),然后检查其余部分;t
    【解决方案3】:

    我遇到了同样的错误,缺少行索引标签而不是列
    例如,我将有一个具有以下 id 的产品数据集:['a','b','c','d']。我将这些产品存储在索引为 ['a','b','c','d'] 的数据框中:

    df=pd.DataFrame(['product a','product b','product c', 'product d'],index=['a','b','c','d'])
    

    现在假设我有一个更新的产品索引: row_indices=['b','c','d','e'] 其中“e”对应一个新产品:“产品 e”。请注意,我的原始索引 ['a','b','c','d'] 中不存在“e”。

    如果我尝试将此更新后的索引传递给我的 df 数据框:df.loc[row_indices,:]

    我会收到这条讨厌的错误消息:

    KeyError:“不再支持将列表喜欢传递给带有任何缺失标签的 .loc 或 []。缺少以下标签:Index(['e'], dtype='object')。

    为避免此错误,我需要将更新后的索引与原始索引相交:

    df.loc[df.index.intersection(row_indices),:]  
    

    this is in line with recommendation of what pandas docs

    【讨论】:

    • 我今天遇到了这个问题,你救了我的命。非常感谢@Kuffner
    • 谢谢你 - 我需要一种快速的方法来重新索引股票价格数据,以便在非市场日有填充价格(只需使用填充和日期范围重新索引,没有问题),但我还需要指出哪些是市场日 - 我保存了我的原始索引,然后使用 .loc 和原始索引来设置 MarketDay=True - 没有一种正常方法有效 - 这种方法是唯一有效的方法。所以我谢谢你。
    【解决方案4】:

    我在尝试创建新列和现有列时遇到了同样的问题:

    df = pd.DataFrame([[1,2,3]], columns=["a","b","c"])
    def foobar(a,b):
      return a,b
    df[["c","d"]] = df.apply(lambda row: foobar(row["a"], row["b"]), axis=1)
    

    解决方案是添加result_type="expand" 作为apply() 的参数:

    df[["c","d"]] = df.apply(lambda row: foobar(row["a"], row["b"]), axis=1, result_type="expand")
    

    【讨论】:

      【解决方案5】:

      如果对不存在的内容进行索引,则会弹出此错误 - reset_index() 对我有用,因为我正在使用实际索引对实际数据帧的子集进行索引,在这种情况下,该列可能不存在于数据帧中。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2021-03-05
      • 2021-07-18
      • 2020-12-24
      • 2020-07-06
      • 2021-04-24
      • 2020-06-13
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多