代码之家  ›  专栏  ›  技术社区  ›  Van Peer

同时填充pandas数据框中相关列中缺少的值

  •  2
  • Van Peer  · 技术社区  · 6 年前

    我有一个包含两列State和Code的dataframe,每列都缺少值。

    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
    
    4 回复  |  直到 6 年前
        1
  •  4
  •   rafaelc    6 年前

    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
  •  4
  •   jpp    6 年前

    您可以将空字符串替换为 np.nan 然后使用 fillna 具有 pd.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
  •  1
  •   Rushabh Mehta    6 年前

    填写代码

    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)
    
        4
  •  0
  •   gherka    6 年前

    类似的问题 Filling a series based on key value pairs

    使用您的数据:

    (df.replace('', np.nan)
      .sort_values(by=['State', 'Code'], ascending=False)
      .groupby('State').ffill().bfill()
      .groupby('Code').ffill().bfill())
    

    输出:

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