【问题标题】:Simultaneously fill missing values in related columns in pandas dataframe同时填充熊猫数据框中相关列中的缺失值
【发布时间】:2018-08-09 14:20:56
【问题描述】:

我有一个包含两列状态和代码的数据框,每列都有缺失值。

import pandas as pd

df = pd.DataFrame([['Alabama', 'AL'], ['Alaska', 'AK'], ['Arizona', 'AZ'], ['Arkansas', 'AR'], ['Iowa','IA'],['Hawaii','HI'], ['Idaho', 'ID'], ['Alabama', ''], ['', 'IA'], ['Alaska',''], ['', 'AZ']], columns=['State', 'Code'])

缺失值

    State   Code
7   Alabama     
8             IA
9   Alaska  
10            AZ

我尝试过的

state_code_dict = {
    'Alabama': 'AL',
    'Alaska': 'AK',
    'Arizona': 'AZ',
    'Arkansas': 'AR',
    'Iowa':'IA',
    'Hawaii':'HI',
    'Idaho': 'ID',    
}

def state_code(x):
    if (x['Code'] == ''):
        return state_code_dict[x['State']]
    else:
        return x['Code']

df['Code'] = df.apply(lambda x: state_code(x), axis=1)

这会设置代码中的缺失值。我还需要更新此功能以设置状态。我希望简化这一点。

需要的输出

    State   Code
7   Alabama   AL
8   Iowa      IA
9   Alaska    AK
10  Arizona   AZ

【问题讨论】:

  • 我确定我之前看到过类似的问题

标签: python python-3.x pandas dataframe


【解决方案1】:

IIUC,您可以使用map 先映射代码,然后再映射状态,使用布尔掩码仅在您有空值时分配值

mask = df.Code == ''
df.loc[mask, 'Code'] = df[mask].State.map(state_code_dict)

mask = df.State == ''
df.loc[mask, 'State'] = df[mask].Code.map({v:k for k,v in state_code_dict.items()})

    State   Code
0   Alabama AL
1   Alaska  AK
2   Arizona AZ
3   Arkansas    AR
4   Iowa    IA
5   Hawaii  HI
6   Idaho   ID
7   Alabama AL
8   Iowa    IA
9   Alaska  AK
10  Arizona AZ

【讨论】:

    【解决方案2】:

    您可以将空白字符串替换为np.nan,然后将fillnapd.Series.map 一起使用。与@RafaelC 类似的想法,但实现方式不同。

    code_state_dict = {v: k for k, v in state_code_dict.items()}
    
    df.replace('', np.nan, inplace=True)
    df['Code'].fillna(df['State'].map(state_code_dict), inplace=True)
    df['State'].fillna(df['Code'].map(code_state_dict), inplace=True)
    
    print(df)
    
           State Code
    0    Alabama   AL
    1     Alaska   AK
    2    Arizona   AZ
    3   Arkansas   AR
    4       Iowa   IA
    5     Hawaii   HI
    6      Idaho   ID
    7    Alabama   AL
    8       Iowa   IA
    9     Alaska   AK
    10   Arizona   AZ
    

    【讨论】:

      【解决方案3】:

      填写代码

      df['Code'] = df.apply(lambda x: x['Code'] if x['Code']!='' else state_code_dict[x['State']],axis=1)
      

      填写状态

      state_code_dict2 = {v: k for k, v in state_code_dict.items()}
      df['State'] = df.apply(lambda x: x['State'] if x['State']!='' else state_code_dict2[x['Code']],axis=1)
      

      【讨论】:

      • 请尝试复制并再次粘贴。
      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2017-08-21
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多