gpt4 book ai didi

pandas - 重命名列后得到keyerror

转载 作者:行者123 更新时间:2023-12-03 23:28:01 25 4
gpt4 key购买 nike

我有 df :

df = pd.DataFrame({'a':[7,8,9],
'b':[1,3,5],
'c':[5,3,6]})

print (df)
a b c
0 7 1 5
1 8 3 3
2 9 5 6

然后将第一个值重命名为 this :
df.columns.values[0] = 'f'

一切看起来都很好:
print (df)
f b c
0 7 1 5
1 8 3 3
2 9 5 6

print (df.columns)
Index(['f', 'b', 'c'], dtype='object')

print (df.columns.values)
['f' 'b' 'c']

如果选择 b它很好用:
print (df['b'])
0 1
1 3
2 5
Name: b, dtype: int64

但是如果选择 a它返回列 f :
print (df['a'])
0 7
1 8
2 9
Name: f, dtype: int64

如果选择 f获取 key 错误。
print (df['f'])
#KeyError: 'f'

print (df.info())
#KeyError: 'f'

什么是问题?有人可以解释一下吗?还是错误?

最佳答案

您不应更改 values属性。

试试 df.columns.values = ['a', 'b', 'c']你得到:

---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-61-e7e440adc404> in <module>()
----> 1 df.columns.values = ['a', 'b', 'c']

AttributeError: can't set attribute


那是因为 pandas检测到您正在尝试设置属性并阻止您。

但是,它不能阻止您更改基础 values对象本身。

当您使用 rename , pandas跟进一堆清理的东西。我已经粘贴了下面的来源。

最终,您所做的是在不启动清理的情况下更改了值。您可以通过调用 _data.rename_axis 的后续电话自行启动。 (示例可以在下面的源代码中看到)。这将强制运行清理,然后您可以访问 ['f']
df._data = df._data.rename_axis(lambda x: x, 0, True)
df['f']

0 7
1 8
2 9
Name: f, dtype: int64

故事的寓意:以这种方式重命名列可能不是一个好主意。

但是这个故事变得更奇怪了

这可以
df = pd.DataFrame({'a':[7,8,9],
'b':[1,3,5],
'c':[5,3,6]})

df.columns.values[0] = 'f'

df['f']

0 7
1 8
2 9
Name: f, dtype: int64

这是 不是 美好的
df = pd.DataFrame({'a':[7,8,9],
'b':[1,3,5],
'c':[5,3,6]})

print(df)

df.columns.values[0] = 'f'

df['f']

KeyError:


原来,我们可以修改 values显示前的属性 df它显然会在第一个 display 上运行所有初始化.如果在更改 values 之前显示它属性,会报错。

更怪异
df = pd.DataFrame({'a':[7,8,9],
'b':[1,3,5],
'c':[5,3,6]})

print(df)

df.columns.values[0] = 'f'

df['f'] = 1

df['f']

f f
0 7 1
1 8 1
2 9 1

好像我们还不知道这是个坏主意……

rename 的来源
def rename(self, *args, **kwargs):

axes, kwargs = self._construct_axes_from_arguments(args, kwargs)
copy = kwargs.pop('copy', True)
inplace = kwargs.pop('inplace', False)

if kwargs:
raise TypeError('rename() got an unexpected keyword '
'argument "{0}"'.format(list(kwargs.keys())[0]))

if com._count_not_none(*axes.values()) == 0:
raise TypeError('must pass an index to rename')

# renamer function if passed a dict
def _get_rename_function(mapper):
if isinstance(mapper, (dict, ABCSeries)):

def f(x):
if x in mapper:
return mapper[x]
else:
return x
else:
f = mapper

return f

self._consolidate_inplace()
result = self if inplace else self.copy(deep=copy)

# start in the axis order to eliminate too many copies
for axis in lrange(self._AXIS_LEN):
v = axes.get(self._AXIS_NAMES[axis])
if v is None:
continue
f = _get_rename_function(v)

baxis = self._get_block_manager_axis(axis)
result._data = result._data.rename_axis(f, axis=baxis, copy=copy)
result._clear_item_cache()

if inplace:
self._update_inplace(result._data)
else:
return result.__finalize__(self)

关于pandas - 重命名列后得到keyerror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43291781/

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