Pandas出现KeyError及其分析解决

本文讲述了如何在Pandas DataFrame中使用.str.startswith()进行批量赋值,并探讨了链式赋值时的SettingWithCopy警告。了解了设置模式以处理链接索引的副本问题,以及推荐的.loc和.mask访问方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红色字体是解决方案

# Setting multiple items using a mask

#使用.str.startswith('o') 指定批量赋值的位置


In [364]: mask = dfd['a'].str.startswith('o')

In [365]: dfd.loc[mask, 'c'] = 42

 (从下内容机器翻译)

使用链接索引时,索引操作的顺序和类型将部分确定结果是原始对象中的切片,还是切片的副本。

pandas具有“复制警告”设置,因为分配给切片的副本通常不是故意的,而是链接索引返回预期切片所在的副本所导致的错误。

如果希望pandas或多或少信任对链接索引表达式的赋值,可以设置 mode.chained_assignment为以下值之一:

  • 默认情况下,“警告”表示打印带有复印警告的设置。
  • “raise”表示pandas将提出一个设置,但你必须处理切片副本的例外情况。
  • 没有人会完全压制这些警告。

In [360]: dfb = pd.DataFrame({'a': ['one', 'one', 'two',
   .....:                           'three', 'two', 'one', 'six'],
   .....:                     'c': np.arange(7)})
   .....: 

# This will show the SettingWithCopyWarning
# but the frame values will be set
In [361]: dfb['c'][dfb['a'].str.startswith('o')] = 42
但是,这是在副本上运行的,将不起作用。
>>> pd.set_option('mode.chained_assignment','warn')
>>> dfb[dfb['a'].str.startswith('o')]['c'] = 42
Traceback (most recent call last)
     ...
SettingWithCopyWarning:
     A value is trying to be set on a copy of a slice from a DataFrame.
     Try using .loc[row_index,col_indexer] = value instead

在混合 dtype 框架的设置中,链式分配也可能突然出现。

注意

这些设置规则适用于所有 ..loc/.iloc

以下是对多个项目(使用 )和单个项目使用固定索引的推荐访问方法:.locmask

In [362]: dfc = pd.DataFrame({'a': ['one', 'one', 'two',
   .....:                           'three', 'two', 'one', 'six'],
   .....:                     'c': np.arange(7)})
   .....: 

In [363]: dfd = dfc.copy()

# Setting multiple items using a mask
In [364]: mask = dfd['a'].str.startswith('o')

In [365]: dfd.loc[mask, 'c'] = 42

In [366]: dfd
Out[366]: 
       a   c
0    one  42
1    one  42
2    two   2
3  three   3
4    two   4
5    one  42
6    six   6

# Setting a single item
In [367]: dfd = dfc.copy()

In [368]: dfd.loc[2, 'a'] = 11

In [369]: dfd
Out[369]: 
       a  c
0    one  0
1    one  1
2     11  2
3  three  3
4    two  4
5    one  5
6    six  6

以下情况有时可能有效,但不能保证,因此应避免:

In [370]: dfd = dfc.copy()

In [371]: dfd['a'][2] = 111

In [372]: dfd
Out[372]: 
       a  c
0    one  0
1    one  1
2    111  2
3  three  3
4    two  4
5    one  5
6    six  6

最后,后续示例将根本不起作用,因此应避免:

>>> pd.set_option('mode.chained_assignment','raise')
>>> dfd.loc[0]['a'] = 1111
Traceback (most recent call last)
     ...
SettingWithCopyException:
     A value is trying to be set on a copy of a slice from a DataFrame.
     Try using .loc[row_index,col_indexer] = value instead

### 解决 Pandas DataFrame 中 `KeyError` 错误的方法 #### 1. 确认列名是否存在 在尝试访问 DataFrame 列之前,应该先确认该列确实存在于 DataFrame 中。可以通过打印 DataFrame 的 `.columns` 属性来查看所有可用的列名称。 ```python import pandas as pd df = pd.read_csv('1site.csv') print(df.columns.tolist()) ``` 如果发现 `'age'` 并不在列表中,则可能是拼写错误或者文件中的实际列名为其他形式[^1]。 #### 2. 处理缺失或多余的空白字符 有时 CSV 文件内的列名可能含有前导或尾随空格,这会导致即使看起来相同的字符串也无法匹配成功。可以使用 strip 方法去除这些不必要的空白: ```python df.rename(columns=lambda x: x.strip(), inplace=True) ``` 之后再试一次访问所需的列。 #### 3. 正确区分大小写敏感度 Pandas 是严格区分大小写的;因此,在指定要查询的字段时要注意保持一致的大写字母和小写字母组合方式。例如,如果原始数据集中某列为 `"Age"` 而不是全部小写的 `"age"` ,那么直接用后者就会引发异常。 #### 4. 对于遍历时产生的 KeyError 对于像 `for i in range(15): print(col.loc[i])` 这样因为索引不对应而引起的 `KeyError` , 应确保使用的索引与当前 DataFrame 设置相吻合。如果是基于位置的操作建议采用 `iloc[]`, 否则应当调整循环变量以适应自定义索引范围[^3]: ```python # 如果知道确切长度并希望按自然数顺序迭代每一行 for idx in df.index: print(df.loc[idx]) # 或者更简单地利用 iterrows() for index, row in df.iterrows(): print(row['column_name']) ``` 通过以上措施通常能够有效预防及修复大部分由 `KeyError` 所带来的麻烦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值