Python 如何根据数据帧中的行条件添加新列?

Python 如何根据数据帧中的行条件添加新列?,python,pandas,dataframe,Python,Pandas,Dataframe,我想根据行条件添加新列,行条件基于相同数据帧的两个不同列 我有以下数据帧- df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:'',6:''}, 'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506',6:''}} df=pd.DataFrame(df1_data) print df 我想添加名为“sym”的新列 条件- 如果“e_id”列值不为空,则sym列值为“e_id”

我想根据行条件添加新列,行条件基于相同数据帧的两个不同列

我有以下数据帧-

df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:'',6:''},
        'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506',6:''}}
df=pd.DataFrame(df1_data)
print df
我想添加名为“sym”的新列

条件-

  • 如果“e_id”列值不为空,则sym列值为“e_id”列值
  • 如果“r\u id”列值不为null,则sym列值为“r\u id”列值
  • 如果“e_id”和“r_id”两个列值都为null,则从数据帧中删除此特定行
  • 我尝试了以下代码-

    df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:''},
            'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506'}}
    
    df=pd.DataFrame(df1_data)
    print df
    
    if df['e_id'].any():
        df['sym'] = df['e_id']
    print df
    
    if df['r_id'].any():
        df['sym'] = df['r_id']
    print df
    
    但它给了我一个错误的输出

    预期产出-

      e_id r_id  sym
    0  101       101
    1       502  502
    2  103       103
    3       504  504
    4  105       105
    5       506  506
    
    熊猫

    使用
    mask
    +
    fillna
    +
    assign


    它的工作原理

    %%timeit
    e = df.e_id.values
    r = df.r_id.values
    df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
    1000 loops, best of 3: 1.23 ms per loop
    
    %%timeit
    d1 = df.mask(df == '')
    df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
    100 loops, best of 3: 2.44 ms per loop
    
    %%timeit
    v = df.values
    m = (v != '').any(1)
    v = v[m]
    c1 = v[:, 0]
    c2 = v[:, 1]
    pd.DataFrame(
        np.column_stack([v, np.where(c1 != '', c1, c2)]),
        df.index[m], df.columns.tolist() + ['sym']
    )
    1000 loops, best of 3: 204 µs per loop
    
    • 我需要用你的意思是空的假设来掩盖你的
      '
    • 通过使用
      fillna
      I获取
      e\u id
      如果它不为空,否则获取
      r\u id
      如果它不为空
    • dropna
      with
      subset=['sym']
      仅当新列为空时才会删除行,而只有
      e\u id
      r\u id
      都为空时才会删除行

    numpy

    使用
    np.where
    +
    assign

    numpy
    v2

    从值重构数据帧


    定时

    %%timeit
    e = df.e_id.values
    r = df.r_id.values
    df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
    1000 loops, best of 3: 1.23 ms per loop
    
    %%timeit
    d1 = df.mask(df == '')
    df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
    100 loops, best of 3: 2.44 ms per loop
    
    %%timeit
    v = df.values
    m = (v != '').any(1)
    v = v[m]
    c1 = v[:, 0]
    c2 = v[:, 1]
    pd.DataFrame(
        np.column_stack([v, np.where(c1 != '', c1, c2)]),
        df.index[m], df.columns.tolist() + ['sym']
    )
    1000 loops, best of 3: 204 µs per loop
    
    熊猫

    使用
    mask
    +
    fillna
    +
    assign


    它的工作原理

    %%timeit
    e = df.e_id.values
    r = df.r_id.values
    df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
    1000 loops, best of 3: 1.23 ms per loop
    
    %%timeit
    d1 = df.mask(df == '')
    df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
    100 loops, best of 3: 2.44 ms per loop
    
    %%timeit
    v = df.values
    m = (v != '').any(1)
    v = v[m]
    c1 = v[:, 0]
    c2 = v[:, 1]
    pd.DataFrame(
        np.column_stack([v, np.where(c1 != '', c1, c2)]),
        df.index[m], df.columns.tolist() + ['sym']
    )
    1000 loops, best of 3: 204 µs per loop
    
    • 我需要用你的意思是空的假设来掩盖你的
      '
    • 通过使用
      fillna
      I获取
      e\u id
      如果它不为空,否则获取
      r\u id
      如果它不为空
    • dropna
      with
      subset=['sym']
      仅当新列为空时才会删除行,而只有
      e\u id
      r\u id
      都为空时才会删除行

    numpy

    使用
    np.where
    +
    assign

    numpy
    v2

    从值重构数据帧


    定时

    %%timeit
    e = df.e_id.values
    r = df.r_id.values
    df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
    1000 loops, best of 3: 1.23 ms per loop
    
    %%timeit
    d1 = df.mask(df == '')
    df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
    100 loops, best of 3: 2.44 ms per loop
    
    %%timeit
    v = df.values
    m = (v != '').any(1)
    v = v[m]
    c1 = v[:, 0]
    c2 = v[:, 1]
    pd.DataFrame(
        np.column_stack([v, np.where(c1 != '', c1, c2)]),
        df.index[m], df.columns.tolist() + ['sym']
    )
    1000 loops, best of 3: 204 µs per loop
    

    首先,使用以下方法筛选两个空列:

    然后与以下内容一起使用:

    Numpy解决方案,带过滤和:


    首先,使用以下方法筛选两个空列:

    然后与以下内容一起使用:

    Numpy解决方案,带过滤和:


    使用
    pandas.DataFrame.mask
    'other'
    参数,可以从列“e\u id”开始,在“e\u id”为“空”时用“r\u id”值替换其值:

    df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
    
    然后您只需要删除
    sym
    为“空”的行


    使用
    pandas.DataFrame.mask
    'other'
    参数,可以从列“e\u id”开始,在“e\u id”为“空”时用“r\u id”值替换其值:

    df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
    
    然后您只需要删除
    sym
    为“空”的行


    @jezrael-我面临类型错误:无法将['']与df=df[(df!='')中的块值错误进行比较。任何(1)]行,但您的替代解决方案工作正常。;-)好的,没问题。顺便说一句,替代解决方案更快;)@jezrael-我面临类型错误:无法将['']与df=df[(df!='')中的块值错误进行比较。任何(1)]行,但您的替代解决方案工作正常。;-)好的,没问题。顺便说一句,替代解决方案更快;)
    df = df[(df['e_id'] != '') | (df['r_id'] != '')]
    e_id = df.e_id.values
    r_id = df.r_id.values
    df['sym'] = np.where(e_id != '', e_id, r_id)
    print (df)
      e_id r_id  sym
    0  101       101
    1       502  502
    2  103       103
    3       504  504
    4  105       105
    5       506  506
    
    df['sym'] = df['e_id'].mask(df['e_id'] == '', other=df['r_id'], axis=0)
    
    df = df[df.sym!='']