python - 使用带有 df.at[] 输出的字典替换
问题描述
我有多个字典,我试图根据另一列的值替换数据框中的列的值。我有一个带有country
和state
列的数据框。列country
是字符串,state
列是数字。我的字典是这样的:
us_state = {1: 'Alabama', 2: 'Alaska', 3: 'Illinois', 4: 'Ohio'}
can_state = {1: 'Edmonton, 2: 'Sasketchwan', 3: 'Manitoba'}
我最初的想法是在列上使用 for 循环和条件country
。如果 country 等于某个值,请使用以下列表:
def convert_state(df):
for i, j in df.iterrows():
if j['country'] == 'United States':
df.at[i, 'state_edit'] = df.at[i, 'state'].replace(us_state)
if j['country] == 'Canada':
df.at[i, 'state_edit'] = df.at[i, 'state'].replace(can_state)
我得到的错误是AttributeError: 'numpy.int8' object has no attribute 'replace'
. 这与df.at[]
我不确定如何处理的输出有关。我尝试使用将其转换为数据框pd.DataFrame()
,但又出现了另一个错误。我将如何使这种方法起作用-使用条件并应用正确的字典?
这是数据框的示例
import pandas as pd
data = {'country':['United States', 'United States', 'Canada', 'United States'], 'state':[4, 2, 2, 1]}
df = pd.DataFrame(data)
state_edit 被创建为函数中的第三列
解决方案
您可以numpy.where
根据国家/地区有条件地选择映射状态:
import numpy as np
df['state_edit'] = np.where(
df.country.eq('United States'),
df.state.map(us_state),
df.state.map(can_state)
)
df
country state state_edit
0 United States 4 Ohio
1 United States 2 Alaska
2 Canada 2 Sasketchwan
3 United States 1 Alabama
或者numpy.select
,如果您有多个条件,请使用:
df['state_edit'] = np.select(
[df.country == 'United States', df.country == 'Canada'],
[df.state.map(us_state), df.state.map(can_state)]
)
df
country state state_edit
0 United States 4 Ohio
1 United States 2 Alaska
2 Canada 2 Sasketchwan
3 United States 1 Alabama
推荐阅读
- c - CS50 caesar.c - 密文打印超出 ASCII 代码范围
- lisp - 为什么 lisp 中的 mapcar 使用名称而不是函数?
- kubernetes - 如何防止 Pod/Container 在扩展时覆盖现有 PVC 卷的目录
- django-models - ValueError: int() 以 10 为底的无效文字:b ' '
- python-3.x - Pytest如何直接调用带有fixture参数的函数
- php - 更改 ssh 中的内存限制没有改变
- windows - 用于存储驱动程序过滤器
- vue.js - 在这种情况下应该使用哪些选项(发射或作用域槽)
- javascript - Sequelize 自引用多对多;如何指定我加入的内容
- c# - WPF 从资源中获取字符串引发异常