gpt4 book ai didi

python - Pandas 错误 : __setitem__() doesnt recognize dictionary values as a list of column names

转载 作者:行者123 更新时间:2023-12-03 17:18:52 25 4
gpt4 key购买 nike

编辑:看起来这是 Pandas 中的一个潜在错误。查看此 GitHub issue @NicMoetsch 注意到使用字典值分配的意外行为与框架的 __setitem__() 之间的差异有关。和 __getitem__() .

在我之前的代码中,我用字典重命名了一些列:

cols_dict = {
'Long_column_Name': 'first_column',
'Other_Long_Column_Name': 'second_column',
'AnotherLongColName': 'third_column'
}
for key, val in cols_dict.items():
df.rename(columns={key: val}, inplace=True)
(我知道这里不需要循环——在我的实际代码中,我必须在数据帧列表中搜索数据帧的列,并获得字典键的子字符串匹配。)
后来我用 applymap() 做一些清理工作, 用字典值索引,它工作正常
pibs[cols_dict.values()].applymap(
lambda x: np.nan if ':' in str(x) else x
)
但是当我尝试将切片分配回自身时,我收到一个关键错误(完整错误消息 here )。
pibs[cols_dict.values()] = pibs[cols_dict.values()].applymap(
lambda x: np.nan if ':' in str(x) else x
)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~/.local/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
3079 try:
-> 3080 return self._engine.get_loc(casted_key)
3081 except KeyError as err:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: dict_values(['first_column', 'second_column', 'third_column'])
如果我将字典值转换为列表,代码运行良好
pibs[list(cols_dict.values())] = ...
所以我想我只是想知道为什么我能够使用字典值进行切片并运行 applymap()在它上面,但是当我转身并尝试将结果分配回数据框时,我无法使用字典值进行切片。
简单地说:为什么 Pandas 会识别 cols_dict.values()当它用于索引时作为列名列表,而不是用于索引分配时?

最佳答案

该问题似乎与 applymap() 无关。 , 作为使用 aneroid 的例子,没有 applymap() :

import copy

cols_dict = {
'Long_column_Name': 'first_column',
'Other_Long_Column_Name': 'second_column',
'AnotherLongColName': 'third_column'
}

df = pd.DataFrame({'Long_column_Name': range(3),
'Other_Long_Column_Name': range(3, 6),
'AnotherLongColName': range(15, 10, -2),
})
df.rename(columns=cols_dict, inplace=True)

df[cols_dict.values()] = df[cols_dict.values()]
产生相同的错误。
显然不是操作部分不起作用,而是赋值部分,因为
df = df[cols_dict.values()]
工作正常。
使用不同的 DataFrame 组合表明 3在错误信息中
ValueError: Wrong number of items passed 3, placement implies 1
不是由分配部分引起的,因为尝试分配四列 DataFrame 会引发不同的错误:
df2 = pd.DataFrame({'Long_column_Name': range(3),
'Other_Long_Column_Name': range(3, 6),
'AnotherLongColName': range(15, 10, -2),
'ShtClNm': range(10, 13)})
产量
ValueError: Wrong number of items passed 4, placement implies 1
因此,我尝试只分配一列,以便理论上它只通过 1 个工作正常而不会引发错误的项目。
df[cols_dict.values()] = df2['Long_column_Name']
然而结果不是预期的:
df
first_column second_column third_column (first_column, second_column,third_column)
0 0 3 15 0
1 1 4 13 1
2 1 5 11 2
所以对我来说,似乎正在发生的事情是 Pandas 无法识别 cols_dict.values()传递给 df[...] =作为列名列表,而是作为一个新列的名称 (first_column, second_column,third_column) .
这就是为什么它试图用传递给赋值的值填充该新列。由于您传递了许多 (3) 列以分配给它破坏的一个新列。
当您使用 list()df[list(cols_dict.values())] =它工作正常,因为它随后识别出传递了一个列列表。
深入了解 pandas DataFrames ,我想我已经找到了问题所在。
据我了解,pandas 使用 __setitem__()用于分配和 __getitem__()用于查找。这两个函数都使用了 convert_to_index_sliceable()定义 here . convert_to_index_sliceable() ,如果您传递的任何内容都是可切片的,则返回一个切片,并且 None如果不是。
两者 __getitem__()__setitem__()首先检查,是否 convert_to_index_sliceable()返回 None但是如果它没有返回 None ,他们不同。 __getitem__()将索引器转换为 np.intp , 这是 numpy 在返回切片之前的索引日期类型,如下所示:
        # Do we have a slicer (on rows)?
indexer = convert_to_index_sliceable(self, key)
if indexer is not None:
if isinstance(indexer, np.ndarray):
indexer = lib.maybe_indices_to_slice(
indexer.astype(np.intp, copy=False), len(self)
)
# either we have a slice or we have a string that can be converted
# to a slice for partial-string date indexing
return self._slice(indexer, axis=0)
__setitem__()另一方面立即返回:
        # see if we can slice the rows
indexer = convert_to_index_sliceable(self, key)
if indexer is not None:
# either we have a slice or we have a string that can be converted
# to a slice for partial-string date indexing
return self._setitem_slice(indexer, value)
假设没有向 __getitem__() 添加不必要的代码,我想 __setitem__()必须缺少该代码,因为两个预返回注释都与 indexer 声明的内容完全相同。可能是。
我将提出一个 GitHub 问题,询问这是否是预期行为。

关于python - Pandas 错误 : __setitem__() doesnt recognize dictionary values as a list of column names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66961614/

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