首页 > 解决方案 > 使用带有 df.at[] 输出的字典替换

问题描述

我有多个字典,我试图根据另一列的值替换数据框中的列的值。我有一个带有countrystate列的数据框。列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 被创建为函数中的第三列

标签: pythonpandasdataframefor-loop

解决方案


您可以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

推荐阅读